我是全新的计划,来自c#背景。
我以为我正在处理lambda,但我不明白为什么这个例子有效:
(让([f(lambda x x)])(f 1 2 3 4))答案 …
一个 lambda 语法是这样的:
lambda
(lambda argument-list body ...)
看着你的lambda:
(lambda x x)
因此参数列表是 x 而lambda的身体是 x 。
x
Scheme中的列表看起来像 (a b c) ,但确实如此 (a . (b . (c . ()))) 并且在过程参数列表中,如果链以符号结尾,例如 (a b . c) 然后该过程需要2个参数 的 或者更多 强> 。 “rest”参数累积在一个名为的列表中 c 。在ES6中它和它一样 (a, b, ...c) => expression 。现在,如果您没有强制性参数,例如。如果允许0个或多个参数,则参数列表只是一个符号。例如 (lambda x x) 是相同的 (...x) => x 。
(a b c)
(a . (b . (c . ())))
(a b . c)
c
(a, b, ...c) => expression
(...x) => x
我相信C#而不是 x 一个人会写的 params type[] x 。 C#没有匿名lambda + rest参数,所以我希望你知道一些ES6。
params type[] x
事实上, lambda 在你的代码中 是 接收参数,以及它们的aribtrary数量。一个的语法 lambda 没有参数是不同的:
(let ([f (lambda () 1)]) (f)) => 1
该 lambda 问题中的表达是另外的:
它接收一个可变数量的参数作为列表,然后返回它们。你命名了 f ,当它被调用时:
f
(f 1 2 3 4)
所有的参数都受到约束 x , 一个 名单 然后是价值 x 退回:
'(1 2 3 4)
所以, f 只不过是一个 身分 接收多个参数的函数。也许这个 回答 将阐明如何在Scheme中定义可变函数。为了完整起见,这是一个例子 lambda 收到一个 单 参数并返回它:
(let ([f (lambda (x) x)]) (f 1)) => 1
所以你有它,这就是我们定义的方式 lambda 接收0,1或许多参数的s。