Scheme 麻省理工学院方案9.2中SICP中的rest程序等效于什么?

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

我正在进行练习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中的
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
。。。谢谢这本书还没有涵盖太多,我想我还没有把它背下来。