続いて、subst と subst2。これは答えを見ちゃった。だって隣に書いてあるんだもの。
ただ、二重の cond は冗長だからひとつにまとめたものを書いた。
subst
(subst new old lat) は lat の中の最初の old を new に置き換える。
(define subst (lambda (new old lat) (cond ((null? lat) (quote ())) ((eq? (car lat) old) (cons new (cdr lat))) (else (cons (car lat) (subst new old (cdr lat)))))))
実行例:
gosh> (subst 'topping 'fudge '(ice cream with fudge for dessert)) (ice cream with topping for dessert)
subst2
(subst2 new o1 o2 lat) は lat の中の最初の o1 または o2 を new に置き換える。
(define subst2 (lambda (new o1 o2 lat) (cond ((null? lat) (quote ())) ((or (eq? (car lat) o1) (eq? (car lat) o2)) (cons new (cdr lat))) (else (cons (car lat) (subst2 new o1 o2 (cdr lat)))))))
実行例:
gosh> (subst2 'vanilla 'chocolate 'banana '(banana ice cream with chocolate topp ing)) (vanilla ice cream with chocolate topping)