如今,似乎有许多主流语言支持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的绑定是表达式的局部内容,因此整个表达式实际上是一个匿名函数。


还有其他吗?

最佳答案

大多数语言都通过使用Y combinator来支持它。这是Python中的一个示例(来自cookbook):

# Define Y combinator...come on Gudio, put it in functools!
Y = lambda g: (lambda f: g(lambda arg: f(f)(arg))) (lambda f: g(lambda arg: f(f)(arg)))

# Define anonymous recursive factorial function
fac = Y(lambda f: lambda n: (1 if n<2 else n*f(n-1)))
assert fac(7) == 5040

关于recursion - 哪些语言支持*递归*函数文字/匿名函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/156369/

10-10 16:45
查看更多