insertRとinsertL

さあ、今日は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)) とも書けるとのこと。なるほど、そのとおりだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください