我的朋友向我展示了这一点,我很好奇为什么它会这样.我起初认为这将是一个语法错误,但它不会...这是我的一些实验:
> (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)
所以它看起来:
lambda,lambda可能是arg-ids?lambda,lambda可能是一个列表构造函数?哦,我明白了.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)
这些解释了!