【发布时间】:2016-05-30 01:06:38
【问题描述】:
我正在练习 2.32,它提供以下代码:
(define (subsets s)
(if (null? s)
(list nil)
(let ((rest (subsets (cdr s))))
(append rest (map <??> rest)))))
当我尝试在 MIT Scheme 9.2 中调用 rest 过程时,它无法识别该过程(书中的 nil 存在类似问题,在现代 Scheme 中被 () 取代)。现代Scheme中等效的rest过程是什么?我不相信是cdr,因为整本书都使用了cdr。
【问题讨论】:
-
您提供的代码中没有
rest过程。 -
注意:在旧的 Scheme 代码中,与对相关的运算符是:
cons、car和cdr。由于可以使用cons来构建除列表之外的其他数据结构,因此无法确定(cdr xs)是一个列表——除非检查上下文。为了表明正在处理列表,有些人使用函数first和rest而不是car和cdr。这个想法是人们知道(rest xs)是一个列表——不管上下文是什么。最后:SICP 是在大会召开前几年编写的,因此 SICP 作者使用car和cdr。
标签: scheme lisp sicp mit-scheme