Jamie Zawinski在他的(1997) article "java sucks"中使用了这个术语,好像你应该知道它的意思:
我真的讨厌缺少向下的乐趣;匿名类是一个蹩脚的替代品。(我可以不使用长时间的闭包,但我发现缺少函数指针是一个巨大的痛苦。)
这似乎是Lisper的俗语,我可以找到以下简短的定义here,但不知何故,我想我仍然不明白:
许多闭包仅在它们引用的绑定范围内使用;在Lisp语言中,这些闭包被称为“向下函数”。
如果不是Steve Yegge,我现在可能会觉得自己很愚蠢,但似乎可以这样问:
杰米·扎温斯基是个英雄。一个活着的传奇人物。... 一个家伙可以用“向下的funargs”这个词,然后盯着你看,只是让你敢问他怎么解释,你这个笨蛋。
-- XEmacs is dead, long live XEmacs
那么这里有没有Lisper可以为像我这样的C风格程序员编译这个代码呢?
发布于 2009-02-24 10:12:36
向下函数是不返回或离开其声明作用域的局部函数。它们只能从当前作用域向下传递到其他函数。
两个例子。这是一个向下的funarg:
function () {
var a = 42;
var f = function () { return a + 1; }
foo(f); // `foo` is a function declared somewhere else.
}
而这不是:
function () {
var a = 42;
var f = function () { return a + 1; }
return f;
}
发布于 2009-02-24 15:45:03
在Common Lisp中:
(let ((a 3))
(mapcar (lambda (b) (+ a b))
(list 1 2 3 4)))
-> (4 5 6 7)
在上面的形式中,lambda函数向下传递。当被高阶函数MAPCAR调用时(该函数获取一个函数和一个值列表作为参数,然后将该函数应用于列表中的每个元素并返回结果列表),lambda函数仍然引用LET表达式中的变量'a‘。但这一切都发生在LET表达式中。
将以上内容与此版本进行比较:
(mapcar (let ((a 3))
(lambda (b) (+ a b)))
(list 1 2 3 4))
这里的lambda函数是从LET返回的。往上一点。然后将其传递给MAPCAR。当MAPCAR调用lambda函数时,它周围的LET不再执行-函数仍然需要引用LET中的变量'a‘。
发布于 2009-02-24 10:11:36
在维基上有一篇很有描述性的文章,叫做Funarg problem
“向下的函数也可以指函数在实际执行时的状态。但是,由于根据定义,向下的函数的存在包含在创建它的函数的执行中,因此函数的激活记录通常仍然可以存储在堆栈上。”
https://stackoverflow.com/questions/581182
复制相似问题