我不明白为什么lambda计划会起作用

我不明白为什么lambda计划会起作用,lambda,syntax,scheme,lisp,Lambda,Syntax,Scheme,Lisp,我对scheme完全陌生,出身于c#背景 我以为我已经掌握了lambda,但我不明白为什么这个例子有效: (let ([f (lambda x x)]) (f 1 2 3 4) ) 答案是(1234),但如何解决呢?这是我不明白的x部分。lambda没有参数,所以物体是x,对吗?但我不知道这是什么意思,有人能解释一下吗?谢谢。事实上,您的代码中的lambda正在接收参数,并且它们的数量是非常多的。没有参数的lambda的语法不同: (let ([f (lambda () 1)]) (f)) =

我对scheme完全陌生,出身于c#背景

我以为我已经掌握了lambda,但我不明白为什么这个例子有效:

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

答案是(1234),但如何解决呢?这是我不明白的x部分。lambda没有参数,所以物体是x,对吗?但我不知道这是什么意思,有人能解释一下吗?谢谢。

事实上,您的代码中的
lambda
正在接收参数,并且它们的数量是非常多的。没有参数的
lambda
的语法不同:

(let ([f (lambda () 1)]) (f))
=> 1
问题中的
lambda
表达式是另一个表达式:

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

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

'(1 2 3 4)
因此,
f
不过是一个接收多个参数的标识函数。也许这将澄清在Scheme中如何定义可变函数。为了完整起见,下面是一个
lambda
示例,它接收单个参数并返回它:

(let ([f (lambda (x) x)]) (f 1))
=> 1

这就是我们定义接收0、1或多个参数的
lambda
s的方法。

A
lambda
语法如下:

(lambda argument-list body ...)
看看你的lambda:

(lambda x x)
因此,参数列表是
x
,lambda的主体是
x

Scheme中的列表看起来像
(ab.c)
,但实际上是
(A.(b.(c)())
,并且在过程参数列表中,如果链以符号结束,如
(ab.c)
,则过程采用两个或更多参数。“rest”参数累积在名为
c
的列表中。在ES6中,它与
(a,b,…c)=>表达式相同。现在,如果您没有强制参数,例如,您允许0个或更多参数,那么参数列表只是一个符号。例如
(λx)
(…x)=>x
相同


我相信C#而不是
x
可以编写
params type[]x
。C#不做匿名lambda+rest论证,所以我希望您了解一些ES6。

非常感谢您的解释和链接。我正在读R.Kent Dybvig的《Scheme编程语言》一书,但对于列表之类的东西,我并没有完全理解它的所有解释。以及诸如配对、细胞等概念。如果你能推荐另一本书,我将不胜感激。当然!《小阴谋家》、《如何设计程序》和《SICP》是学习如何在计划中思考的最好的书。昨天我回到办公室时,我发现小阴谋家在我的办公桌旁,这是一位同事提供的。我已经喜欢了。我将查看其他标题,非常感谢。:)多酷啊!对我来说最好的书是SICP,它是一本经典之作。更高级一点,但它不仅会教你语言,还会教你如何为它构建解释器和编译器(!)。这是一些大学的一年级书。@THedge花了很多时间在列表结构上,例如pairs等等。很多用图表。强烈推荐初学者使用。如果你想向你解释概念,请远离这些小书。同样感谢你的解释,这一切都很有帮助。是的,在c#params中,它允许你指定一个可变数量的参数,它出现在过程的参数列表的末尾。这意味着在我之前的回答中是一个方法的参数列表。谢谢你提供关于点符号的信息。点符号是一个例子,在我看来,在我所读的书中没有很好地解释。(在我对Oscar的回答中)既然你知道C语言,在你知道如何在Scheme中实现Scheme子集解释器之后,你应该尝试在C语言中实现Scheme子集解释器。使用Scheme-in-Scheme,由于您使用的是宿主语言,所以很多东西都很简单,但在C#中,您将了解原语和系统需要做什么才能使其工作。我是魔术师们自己呈现的视频的超级粉丝。我会看看你们引用的视频,谢谢!