2016-05-30 25 views
2

我锻炼2.32呈现如下代码:当我尝试调用rest过程中MIT方案9.2它不能识别的程序(也有类似的问题与nil书中麻省理工学院计划9.2中SICP的剩余程序是什么?

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

,在现代化方案中由()取代)。现代计划中的等效rest程序是什么?我不相信它是cdr,因为整本书都使用了cdr

+3

在你给的代码中没有'rest'过程。 – tfb

+1

注意:在旧的Scheme代码中,与pair相关的操作符有:'cons','car'和'cdr'。由于可以使用'cons'构建除列表之外的其他数据结构,因此不能确定'(cdr xs)'是一个列表 - 除非检查上下文。为了表明一个人在列表中工作,有些人使用函数'first'和'rest'而不是'car'和'cdr'。这个想法是,人们知道'(rest xs)'是一个列表 - 不管上下文是什么。最后:SICP是在这个约定的前几年写的,所以SICP的作者使用'car'和'cdr'。 – soegaard

回答

5

你误解了锻炼 - rest不是一个过程,是对应子集的的休息一个局部变量(也许你应该看一看的documentation关于let)。这就是本书所要求的:

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

facepalm ...谢谢。这本书还没有涉及到,我想我还没有记住它。 – Andrew

4

正如@tfb指出的,rest在这段代码中不是一个过程,它是一个局部绑定的符号。

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

相关问题