『The Little Schemer』笔记
Chap.5 全是星星!
原子a
是cup
,列表lat
是((coffee) cup ((tea) cup) (and (hick)) cup)
,定义一个函数rember*
,这里加一个*
会给人一种震惊的感觉。
(rember* a lat)
将不论原子a出现在列表lat的哪个表达式中的哪个部分,都将被去除。即(rember* a lat)
将得到((coffee) ((tea)) (and (hick)))
(define (rember* a l) (cond ((null? l) nil) ((pair? (car l)) (cons (rember* a (car l)) (rember* a (cdr l)))) (else (if (eq? (car l) a) (rember* a (cdr l)) (cons (car l) (rember* a (cdr l)))))) )
Scheme十诫之第一诫(终极式):当对一个原子列表lat进行递归时,询问两个lat的问题:null? lat和else。当对一个数字n进行递归调用时,询问两个有关n的问题:zero?n 和else,当对一个S-表达式进行递归调用时,询问三个有关l的问题null? lat,atom? (car lat)和else。
再编写一个(insertR* new old l)
,这将l中每个单词old的右边插入一个new:
(define (insertR* new old l) (cond ((null? l) nil) ((atom? (car l)) (if (eq? (car l) old) (cons old (cons new (insertR* new old (cdr l)) )) (cons (car l) (insertR* new old (cdr l))) ) ) (else (cons (insertR* new old (car l)) (insertR* new old (cdr l))) ) ) )