我对方案完全陌生,来自c#背景。
我以为我可以使用lambda,但是我不明白为什么这个示例有效:
(let ([f (lambda x x)]) (f 1 2 3 4) )
答案是(1 2 3 4),但是如何?这是我不明白的 x x 部分。 Lambda不带参数,因此主体为 x x ,对吗?但是我不知道在这种情况下意味着什么,有人可以解释吗?谢谢。
答案 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。