我不明白为什么lambda方案有效

时间:2018-12-07 21:23:11

标签: lambda syntax scheme lisp

我对方案完全陌生,来自c#背景。

我以为我可以使用lambda,但是我不明白为什么这个示例有效:

(let ([f (lambda x x)]) (f 1 2 3 4) )

答案是(1 2 3 4),但是如何?这是我不明白的 x x 部分。 Lambda不带参数,因此主体为 x x ,对吗?但是我不知道在这种情况下意味着什么,有人可以解释吗?谢谢。

2 个答案:

答案 0 :(得分:5)

实际上,代码中的..//.正在接收参数,以及它们的序号。没有参数的lambda的语法是不同的:

lambda

问题中的(let ([f (lambda () 1)]) (f)) => 1 表达式是其他内容:

lambda

它以列表形式接收可变数量的参数,然后返回它们。您将其命名为(lambda x x) ,并且在这样调用时:

f

所有参数都绑定到(f 1 2 3 4) ,一个 list 上,然后返回x的值:

x

因此,'(1 2 3 4) 只是一个接收多个参数的 identity 函数。也许这个answer会阐明如何在Scheme中定义可变函数。为了完整起见,下面是一个f的示例,该示例接收一个单个参数并返回它:

lambda

因此,您已经有了它,这就是我们定义接收0、1或许多参数的(let ([f (lambda (x) x)]) (f 1)) => 1 的方式。

答案 1 :(得分:2)

lambda语法如下:

(lambda argument-list body ...)

查看您的lambda:

(lambda x x)

因此,参数列表为x,而lambda的主体为x

Scheme中的列表看起来像(a b c),但实际上是(a . (b . (c . ()))),在过程参数列表中,如果链以符号结尾,例如(a b . c),则过程需要2参数或更多。 “剩余”自变量累积在名为c的列表中。在ES6中,它与(a, b, ...c) => expression相同。现在,如果没有强制性参数,例如。您允许使用0个或多个参数,则参数列表只是一个符号。例如(lambda x x)(...x) => x相同。

我相信使用C#代替x会写成params type[] x。 C#不会做匿名lambda + rest参数,所以我希望您知道一些ES6。