首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是“向下funargs"?

什么是“向下funargs"?
EN

Stack Overflow用户
提问于 2009-02-24 10:09:08
回答 3查看 5K关注 0票数 62

Jamie Zawinski在他的(1997) article "java sucks"中使用了这个术语,好像你应该知道它的意思:

我真的讨厌缺少向下的乐趣;匿名类是一个蹩脚的替代品。(我可以不使用长时间的闭包,但我发现缺少函数指针是一个巨大的痛苦。)

这似乎是Lisper的俗语,我可以找到以下简短的定义here,但不知何故,我想我仍然不明白:

许多闭包仅在它们引用的绑定范围内使用;在Lisp语言中,这些闭包被称为“向下函数”。

如果不是Steve Yegge,我现在可能会觉得自己很愚蠢,但似乎可以这样问:

杰米·扎温斯基是个英雄。一个活着的传奇人物。... 一个家伙可以用“向下的funargs”这个词,然后盯着你看,只是让你敢问他怎么解释,你这个笨蛋。

-- XEmacs is dead, long live XEmacs

那么这里有没有Lisper可以为像我这样的C风格程序员编译这个代码呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-24 10:12:36

向下函数是不返回或离开其声明作用域的局部函数。它们只能从当前作用域向下传递到其他函数。

两个例子。这是一个向下的funarg:

代码语言:javascript
复制
function () {
    var a = 42;
    var f = function () { return a + 1; }
    foo(f); // `foo` is a function declared somewhere else.
}

而这不是:

代码语言:javascript
复制
function () {
    var a = 42;
    var f = function () { return a + 1; }
    return f;
}
票数 58
EN

Stack Overflow用户

发布于 2009-02-24 15:45:03

在Common Lisp中:

代码语言:javascript
复制
(let ((a 3))
  (mapcar (lambda (b) (+ a b))
          (list 1 2 3 4)))

->  (4 5 6 7)

在上面的形式中,lambda函数向下传递。当被高阶函数MAPCAR调用时(该函数获取一个函数和一个值列表作为参数,然后将该函数应用于列表中的每个元素并返回结果列表),lambda函数仍然引用LET表达式中的变量'a‘。但这一切都发生在LET表达式中。

将以上内容与此版本进行比较:

代码语言:javascript
复制
(mapcar (let ((a 3))
          (lambda (b) (+ a b)))
        (list 1 2 3 4))

这里的lambda函数是从LET返回的。往上一点。然后将其传递给MAPCAR。当MAPCAR调用lambda函数时,它周围的LET不再执行-函数仍然需要引用LET中的变量'a‘。

票数 16
EN

Stack Overflow用户

发布于 2009-02-24 10:11:36

在维基上有一篇很有描述性的文章,叫做Funarg problem

“向下的函数也可以指函数在实际执行时的状态。但是,由于根据定义,向下的函数的存在包含在创建它的函数的执行中,因此函数的激活记录通常仍然可以存储在堆栈上。”

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/581182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档