Functional programming LISP中的反向函数

Functional programming LISP中的反向函数,functional-programming,lisp,Functional Programming,Lisp,有人能详细解释一下下面的纯LISP函数是如何工作的吗 (DEFINE (REVERSE (LAMBDA (L) (REV NIL L)))) (DEFINE (REV (LAMBDA (OUT IN) (COND ((NULL IN) OUT) (T (REV (CONS (CAR IN) OUT) (CDR IN)))))) 这个函数应该颠倒列表中元素的顺序,这一点很清楚,但我仍然无法理解它是如何工作的 *编辑* 好吧,我想我已经明白了。 调用

有人能详细解释一下下面的纯LISP函数是如何工作的吗

(DEFINE (REVERSE (LAMBDA (L)
        (REV NIL L))))
(DEFINE (REV (LAMBDA (OUT IN)
        (COND ((NULL IN) OUT)
        (T (REV (CONS (CAR IN) OUT) (CDR IN))))))
这个函数应该颠倒列表中元素的顺序,这一点很清楚,但我仍然无法理解它是如何工作的

*编辑*

好吧,我想我已经明白了。 调用
REVERSE
函数时使用列表作为参数,调用
REV
函数时使用
NIL
和列表
L
作为参数

REV
OUT
绑定到
NIL
IN
绑定到列表
L
。 现在,如果第一个参数(
IN
)为空(
NULL
?),我们就完成了,我们可以返回
OUT
,它是成功反转的列表。 否则,我们必须继续递归调用
REV
,其中
OUT+IN
的第一个元素作为第一个参数,IN的其余元素作为第二个参数。这就是它的工作原理吗


唯一的问题是:这里的
LAMBDA
是怎么回事

是的,这就是它的工作原理。这被称为用于编写函数的累加器参数技术。它通过一些示例帮助可视化其操作,例如:

reverse [1,2,3,4] 
  = rev  NIL  [1,2,3,4]
  = rev  [1]    [2,3,4]
  = rev  [2,1]    [3,4]
  = rev  [3,2,1]    [4]
  = rev  [4,3,2,1]  NIL
  = [4,3,2,1]
您的代码似乎来自一个古老的版本(1982年第1版,ISBN 0-471-08755-6)。在今天的方案中,例如,它写的几乎相同,但没有额外的括号(重新定义的常量很少):

所谓的“lambda表单”,即以
lambda
“关键字”开头的表单(格式良好、带括号的代码片段),表示匿名函数。符号
lambda
后的列表指定此类函数的形式参数
define
允许我们命名lambda表单创建的函数。这样我们就可以在它的定义内使用它的名称对它进行递归调用


此递归调用在中,因此此函数的操作相当于一个循环(通过为函数调用重用,在每次迭代中重置作为循环变量的形式参数来实现)。

因此lambda表单是处理LISP中参数的一种方法,是否正确?@user1291235 lambda表单是在Lisp.Scheme中创建函数的一种方法?用奈尔和T?@uselpa你说得对<代码>定义我想把我甩了。那么,这是什么呢?@uselpa显然这段代码是“编程语言概念-第三版,卡洛·盖齐,迈赫迪·贾扎耶里,约翰·威利和儿子”(1982年第1版),第345页的逐字复制。作者称这种语言为“Lisp”。它要么是
(define(name.args)
,要么是
(define name(lambda args…)
)<代码>(定义(名称)((lambda(l)(rev nil l)))| | | | | |)不起作用。
(define reverse (lambda (l) .... ))
(define rev (lambda (out in) .... ))

(define NIL '())
(define T    #t)
(define NULL null?)