Functional programming LISP中的反向函数
有人能详细解释一下下面的纯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)))))) 这个函数应该颠倒列表中元素的顺序,这一点很清楚,但我仍然无法理解它是如何工作的 *编辑* 好吧,我想我已经明白了。 调用
(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?)