lisp中的lambda函数是如何工作的?

lisp中的lambda函数是如何工作的?,lambda,functional-programming,lisp,land-of-lisp,Lambda,Functional Programming,Lisp,Land Of Lisp,我在书中读到lambda函数是唯一的内置函数。然而,我真的不明白这是怎么可能的,因为我认为您至少需要一个用于加法的命令,一个用于比较数字的命令,以及一个用于将数据从一个变量移动到另一个变量的命令。我想知道是否有人能向我解释lisp是如何做到这一点的。我不是数学家,所以如果可能的话,你能在不使用大量复杂数学的情况下解释一下吗?你把一些事情弄糊涂了lambda不是一个函数。这是一个内置于Lisp语言中的构造 任何实用的Lisp都有许多内置函数;它至少需要car和cdr来区分列表,一些基本算术函数不能

我在书中读到lambda函数是唯一的内置函数。然而,我真的不明白这是怎么可能的,因为我认为您至少需要一个用于加法的命令,一个用于比较数字的命令,以及一个用于将数据从一个变量移动到另一个变量的命令。我想知道是否有人能向我解释lisp是如何做到这一点的。我不是数学家,所以如果可能的话,你能在不使用大量复杂数学的情况下解释一下吗?

你把一些事情弄糊涂了<代码>lambda不是一个函数。这是一个内置于Lisp语言中的构造

任何实用的Lisp都有许多内置函数;它至少需要
car
cdr
来区分列表,一些基本算术函数不能用其他函数来定义。(*)此外,Lisp的“非功能”部分,如
setf
需要一些基本函数


[*]您可以在Lisp中执行,但由于Lisp的类型系统,您无法很好地打印结果,但能否正确打印结果取决于Lisp变体。

这是理论和实际编程语言之间的区别

Lisp接受了Lambda演算的思想,但没有实现它。lambda演算描述了使用函数进行计算的系统。理解Lambda演算很有用,但当您使用Lisp时,您不会使用纯Lambda演算编程

作为一种编程语言,Lisp具有各种数据类型和操作(数字、字符串、字符、cons单元格、符号、函数等)


与图灵机和类似编程语言C的东西相比,

这里“Lisp之地”所说的不是
lambda
是唯一的Lisp原语,而是(根据Alonzo Church的lambda演算,Lisp有理论基础)可以用
lambda
实现Lisp的其余部分,因为lambda演算等价于一个通用图灵机


对于大多数实际应用程序,
lambda
用于定义匿名函数。

最好询问或搜索“我在《lisp之地》一书中读到lambda函数是唯一的内置函数”。你能举出你认为是这样说的整个句子(或段落)吗?我觉得那句话很奇怪<代码>lambda不是函数,它是一种特殊形式。当然,每个lisp中都有内置函数,如果它们不存在,用户就无法定义这些函数(如您提到的+函数)。我认为这本书可能会说lambda是定义内置于语言中的函数的唯一方法(例如,
defun
只是一个建立在lambda之上的宏)。lambda演算是一个图灵完整系统,所以是的,你可以用它做任何事情。但在Lisp中,它的求值语义并不迫切——在这里,您至少需要一个
if
或类似的东西。@SK logic是的,但我们讨论的是另一种语言。您当然可以编写一个函数,只使用lambdas添加两个church编码的数字。但如果一个Clojure数(或两个公共Lisp数,或两个Scheme数)尚未内置,则无法编写添加两个Clojure数的函数。@SK logic我无法想象为什么需要
if
:可以使用lambdas延迟计算。用lambda重建语言的一个很好的例子是at-基本上将
true
定义为
(lambda(xy)x)
false
定义为
(lambda(xy)y)
。然后,您可以将非急切
if
编写为
(lambda(test-Then-else)(funcall(funcall-test-Then-else))
(或者在Clojure中,
(fn[test-Then-else]((test-Then-else))
。如果您对所有内容都使用Church编码,则不需要car和cdr(也就是说,您可以使用Church对)。@SK logic:是的,但是,你不会有真正的Lisp,因为SEXPR是不可能打印的。你可以定义你自己的漂亮打印机(和你自己的解析器,用来生成Church编码的列表,而不是“原生”Lisp列表)。此外,如何定义
car
cdr
,这也是众所周知的,来自纯lambda演算的
cons
——Lisp只提供了它们,因为它们应该是高效的<代码>(defn cons[x y](fn[f](f x y)))(defn car[x](x(fn[x y]x)))(defn cdr[x](x(fn[x y]y)))。这满足了cons/car/cdr的唯一要求:即
(eq(car(cons x y))x
(eq(cdr(cons x y))y)
。这似乎是这个问题的最佳答案。其他的都是初学者所无法理解的。