麻省理工学院计划9.2中SICP的其余程序相当于什么?

时间:2016-05-30 01:06:39

标签: scheme lisp sicp

我正在练习2.32,它提供了以下代码:

(define (subsets s)
  (if (null? s)
      (list nil)
      (let ((rest (subsets (cdr s))))
        (append rest (map <??> rest)))))

当我尝试在麻省理工学院计划9.2中调用rest程序时,它不会识别该程序(书中有nil的类似问题,由{{()取代现代方案中的1}}。现代计划中的等效rest程序是什么?我不相信它是cdr,因为整本书都使用了cdr

2 个答案:

答案 0 :(得分:5)

你误解了练习 - rest不是一个过程,是一个局部变量,它对应于子集的 rest (也许你应该看一下关于letdocumentation。这就是本书所要求的:

(define (subsets set)
  (if (null? set)
      (list '())
      (let ((rest (subsets (cdr set))))
        (append rest
                (map (lambda (sets) (cons (car set) sets))
                     rest)))))

答案 1 :(得分:4)

正如@tfb指出的那样,此代码中的rest不是一个过程,它是一个本地绑定的符号。

也许您误解了有关rest的错误消息;没有看到它,很难说。