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

标签 lambda syntax scheme lisp

我是 scheme 的新手,有 c# 背景。

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

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

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

最佳答案

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

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

问题中的 lambda 表达式是另外一回事:

(lambda x x)

它接收可变数量的参数列表,然后返回它们。你将它命名为 f,当它被这样调用时:

(f 1 2 3 4) 

所有参数都绑定(bind)到x,一个列表,然后返回x 的值:

'(1 2 3 4)

因此,f 只不过是一个接收多个参数的identity 函数。也许这个answer将阐明如何在 Scheme 中定义可变参数函数。为了完整起见,下面是一个 lambda 示例,它接收一个单个 参数并返回它:

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

好了,这就是我们定义接收 0、1 或多个参数的 lambda 的方式。

关于lambda - 我不明白为什么 lambda 方案有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53676950/

相关文章:

list - 我如何用 Eager 语言制作一个懒惰的列表?

c++ - 当我想在外面抓东西时无法编译 lambda

python按行中的最后一个字排序,不同长度的行

arrays - for i in ${VAR} 如何在 bash 中工作,而不是 for i in "${VAR[@]}"?

syntax - 多行字符串作为序列的一部分

postgresql - 我正在尝试为 postgresql 编写一个函数来进行一些字符串操作

方案递归从列表为空后的开头开始

java - 是否有一种方法引用方式来表达一个什么都不做的(Runnable)lambda?

java - 公共(public)静态最终 Lambda?

rotation - 方案:旋转功能不起作用