さあ、今日は3章の残りをやっつけるぞ。まずは insertR から。
insertR
insertR はアトム2つ new、old とラット(アトムのリスト)lat を引数に取り、lat の中の old と同じアトムの右側に new を挿入したラットを返す。
もうこのくらいは答えを見ないでも書ける。
(define insertR
(lambda (new old lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) old) (cons old (cons new (cdr lat))))
(else (cons old (insertR new old (cdr lat)))))))
実行例:
gosh> (insertR 'topping 'fudge '(ice cream with fudge for dessert))
(fudge fudge fudge fudge topping for dessert)
あれ、期待したのと違う。
わかった。間違いは最後の行だ。old を cons してどうする。cons するのは (car lat) だ。
(define insertR
(lambda (new old lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) old) (cons old (cons new (cdr lat))))
(else (cons (car lat) (insertR new old (cdr lat)))))))
実行例:
gosh> (insertR 'topping 'fudge '(ice cream with fudge for dessert))
(ice cream with fudge topping for dessert)
gosh> (insertR 'jalapeno 'and '(tacos tamales and salsa))
(tacos tamales and jalapeno salsa)
今度はOKだ。jalapeno はハラペーニョかな。
insertL
insertL は insertR と違って new を old の左側に挿入する。これは簡単、new と old の cons する順を入れ替えればいいだけだ。
(define insertL
(lambda (new old lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) old) (cons new (cons old (cdr lat))))
(else (cons (car lat) (insertL new old (cdr lat)))))))
実行例:
gosh> (insertL 'topping 'fudge '(ice cream with fudge for dessert))
(ice cream with topping fudge for dessert)
gosh> (insertL 'jalapeno 'and '(tacos tamales and salsa))
(tacos tamales jalapeno and salsa)
うまくいった(註:英語の意味は考えないこと)。
と思ったら、5行目の ((eq? (car lat) old) (cons new (cons old (cdr lat))))
は ((eq? (car lat) old) (cons new lat))
とも書けるとのこと。なるほど、そのとおりだ。