Scheme 麻省理工学院方案9.2中SICP中的rest程序等效于什么?
我正在进行练习2.32,其中给出了以下代码:Scheme 麻省理工学院方案9.2中SICP中的rest程序等效于什么?,scheme,lisp,sicp,mit-scheme,Scheme,Lisp,Sicp,Mit Scheme,我正在进行练习2.32,其中给出了以下代码: (define (subsets s) (if (null? s) (list nil) (let ((rest (subsets (cdr s)))) (append rest (map <??> rest))))) (定义(子集) (如果为空,则为空) (名单无) (let((其余(子集(cdr s))) (附加rest(映射rest(()))) 当我试图调用MIT Scheme 9.2
(define (subsets s)
(if (null? s)
(list nil)
(let ((rest (subsets (cdr s))))
(append rest (map <??> rest)))))
(定义(子集)
(如果为空,则为空)
(名单无)
(let((其余(子集(cdr s)))
(附加rest(映射rest(())))
当我试图调用MIT Scheme 9.2中的
rest
过程时,它无法识别该过程(书中的nil
存在类似的问题,在现代Scheme中被()
替换)。现代方案中的等效rest
程序是什么?我不相信它是cdr
,因为cdr
贯穿全书。正如@tfb指出的那样,rest
在这段代码中不是一个过程,而是一个局部绑定的符号
可能您误解了有关
rest
的错误消息;如果没有看到它,很难说。你误解了练习-rest
不是一个过程,是一个局部变量,对应于子集的其余部分(也许你应该看看关于let
)。这本书的问题是:
(define (subsets set)
(if (null? set)
(list '())
(let ((rest (subsets (cdr set))))
(append rest
(map (lambda (sets) (cons (car set) sets))
rest)))))
您给出的代码中没有
rest
过程。注意:在旧方案代码中,与对相关的运算符为:cons
、car
和,cdr
。由于可以使用cons
构建列表以外的其他数据结构,因此不能确定(cdr xs)
是列表,除非检查上下文。为了表示正在处理列表,有些人使用函数first
和rest
,而不是car
和cdr
。其思想是人们知道(rest-xs)
是一个列表——不管上下文是什么。最后:SICP是在本公约之前几年编写的,因此SICP的作者使用car
和cdr
。。。谢谢这本书还没有涵盖太多,我想我还没有把它背下来。