什么是(lambda lambda lambda)?

时间:2016-02-16 07:29:22

标签: 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)

所以看来:

  1. lambdalambda可能是arg-ids?
  2. lambda中,lambda可以是列表构造函数吗?

1 个答案:

答案 0 :(得分:7)

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

> ((lambda (lambda) (+ 1 lambda)) 7)
8

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

> ((lambda foo foo) 1 2 3 4)
'(1 2 3 4)

这些解释了它!