什么是(lambda lambda lambda)?

Sor*_*ase 7 racket

我的朋友向我展示了这一点,我很好奇为什么它会这样.我起初认为这将是一个语法错误,但它不会...这是我的一些实验:

> (lambda lambda lambda)
#<procedure>
> ((lambda lambda lambda))
'()
> ((lambda lambda lambda) 1 2 3 4 5 6 7)
'(1 2 3 4 5 6 7)
> (lambda lambda foo)
#<procedure>
> ((lambda lambda foo))
foo: undefined;
 cannot reference an identifier before its definition
> (lambda lambda 1 2 3 4 5)
#<procedure>
> ((lambda lambda 1 2 3 4 5))
5
> (lambda foo lambda)
. lambda: bad syntax in: lambda
> (lambda 1 2 3)
. lambda: bad argument sequence in: 1
> ((lambda) 1 2 3)
. lambda: bad syntax in: (lambda)
Run Code Online (Sandbox Code Playgroud)

所以它看起来:

  1. lambda,lambda可能是arg-ids?
  2. lambda,lambda可能是一个列表构造函数?

Sor*_*ase 8

哦,我明白了.lambda可能会被遮蔽!

> ((lambda (lambda) (+ 1 lambda)) 7)
8
Run Code Online (Sandbox Code Playgroud)

另外,https : //docs.racket-lang.org/guide/lambda.html中给出的语法并不完全正确,因为在arg-ids位置上,标识符可能就在那里!这将使用标识符绑定参数列表:

> ((lambda foo foo) 1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

这些解释了!

  • 是.然而,还有一个奇怪的例子,这不能解释.`(lambda lambda foo)`=`#<procedure>`.那是因为这是在一个REPL,你可以做``(define(fx)foo)`然后定义foo,以便相互递归工作.但是对于这些东西,你真的应该将它们放在一个文件中,因为这将显示它们的真实行为.在一个文件本身,`(lambda lambda foo)`将是一个错误,应该如此. (2认同)