我试图用C语言实现一些人工智能规划算法,但是我坚持了基本的概念:)
在讨论主要问题之前,我尝试实现一些支持命题逻辑的小框架:
FORMULA f = PROPOSITION(a + 3 > 0);
FORMULA g = PROPOSITION(is_smaller_than(b, c));
f = AND(NOT(f), g);
现在的问题是,在定义公式时,我不想计算像'a +3> 0‘这样的表达式,而是在以后的一些阶段:
bool res = EVALUATE(f);
在这种情况下,我想闭包会很方便,但不幸的是,我也喜欢坚持使用C99。
有什么想法吗?
,将其扩展到谓词
AFAIK,C++11/14不允许在定义lambda时对新的返回类型进行就地定义。但是,似乎C++14 lambda捕获表达式实际上创建了一个匿名类型,包含一个或多个“成员”和一个运算符()。所以,为什么编译器不允许访问以外的 lambda捕获的成员。我软弱的头脑无法处理C++的复杂性,但对您来说,这听起来像是一个合理的语言扩展吗?下面是一个例子。
vector<string> words = { "Stack", "Overflow" };
auto l = [w = words](){}; // almost like a C# anonymou
我一直在尝试了解Ruby块的工作原理,为此,我一直在尝试用C语言实现它们。
实现闭包的一种简单方法是将一个void*传递给封闭堆栈的闭包/函数,但是Ruby块似乎还处理使用该块的作用域中的返回和中断语句。
loop do
break i if (i >= 4000)
i *= 2
end
我认为Java的其中一个闭包提案也是这样工作的。
那么,如何在C中实现Ruby块/Java闭包呢?
我试图向一位同事描述他们的代码是如何构造的,我正在寻找他实现的反模式的名称(它违反的软件原则的加分)。我使用JS演示,但这不是JS特定的。
function x() {
var a, b, c;
var doWork = function(){
a = 1;
b = 2;
addAB();
return c;
};
var addAB = function(){
c = a + b;
};
var result = doWork();
}
他使用父作用域在函数
为了更好地理解C++ lambda的实现,我愚弄了编译器,将lambda作为一个对象来处理,看起来它们在内存中的布局方式是一样的。
Note:这只是为了澄清,我并不是主张在生产中编写这类黑客
这是由语言规范所保证的,还是编译器实现的细节?
struct F
{
int a; int b; int c;
void printLambdaMembers()
{
cout << this << endl; // presumably the lambda 'this'
cout << a
如下代码所示:
var foo = function() {
var a = 1; // closure var
return function() { // closure fun
console.log(a);
}
};
var bar = foo();
当foo退出(或者说,返回)时,我们知道变量a不会被销毁并留在内存中(这就是闭包工作的原因)。因此,我的问题是变量在哪里存储、堆栈或堆?
我最近一直在用像Lua这样的脚本语言编写代码,而匿名内部函数的存在让我开始思考。用C实现的语言(如Lua )如何具有内部函数,而在C中,无论您做什么,您都不能回避这样一个事实:在编译期间,函数必须事先声明好?这是否意味着在C中,实际上有一种方法可以实现内部功能,而这只是实现一个庞大的代码库以使其成为可能的问题?
例如
void *block = malloc(sizeof(1) * 1024); // somehow
// write bytes to this memory address to make it operate
// like an inner function?
// i
在Swift 4中,我如何在curry func的同时保留param label/ name:
func doSomething(a: A, b: B, c: C) {
}
let do_a = doSomething(a: value_a) // keep name a
let do_ab = do_a(b: value_b) // keep name b
let result = do_ab(c: value_c) // keep name c
有了这里的答案
和
我可以这样做,但是标签被省略了
let curryDo = curry(doSomething)
let doA = cur
我使用JS已经两年了,我的pluralsight访问将我评为精通JS,我了解原型继承、高阶函数、IIFE等,我在现实世界中使用过它们,但闭包是您理解的概念之一,但您无法找到在现实世界开发中使用它们的任何理由,我的意思是,如果我说,
function expClosure(val){
//do something to val-->anotherVal
return function(val){return anotherVal)};
}
var exp = expClosure(val);
exp(); --> returns the value of anotherV