【发布时间】:2010-09-14 10:58:10
【问题描述】:
现在似乎有不少主流语言支持function literals。他们也被称为anonymous functions,但我不在乎他们有没有名字。重要的是,函数字面量是一个表达式,它产生一个尚未在其他地方定义的函数,例如在 C 中,&printf 不计算在内。
编辑补充:如果你有一个真正的函数文字表达式<exp>,你应该能够将它传递给一个函数f(<exp>)或立即将它应用到一个参数,即。 <exp>(5)。
我很好奇哪些语言可以让你编写递归的函数字面量。维基百科的“anonymous recursion”文章没有给出任何编程示例。
我们以递归阶乘函数为例。
以下是我知道的:
-
JavaScript / ECMAScript 可以用
callee做到这一点:function(n){if (n<2) {return 1;} else {return n * arguments.callee(n-1);}} -
使用
letrec的语言很容易,例如 Haskell(称为let):let fac x = if x<2 then 1 else fac (x-1) * x in fac在 Lisp 和 Scheme 中也有等价物。请注意,
fac的绑定是表达式的局部变量,因此整个表达式实际上是一个匿名函数。
还有其他的吗?
【问题讨论】:
-
匿名函数与动态函数不同,区别在于作用域,匿名函数或“函数字面量”是一个真正的对象,就像整数3一样。例如,5.3之前的PHP确实有动态函数,但不是匿名的。 (见下文)
标签: recursion language-features anonymous-function function-literal letrec