(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

コードの最適化?

ということでちょっとコード書きますよっと。
Scheme手習いから。

(define (insertR new old lat)
  (cond
   ((null? lat) '())
   (else (cond
	  ((eq? old (car lat))
	   (cons old (cons new (cdr lat))))
	  (else
	   (cons old (insertR new old (cdr lat))))))
(define (multiinsertR new old lat)
  (cond
   ((null? lat) '())
   (else
    (cond
     ((eq? (car lat) old)
      (cons old (cons new
		      (multiinsertR new old (cdr lat)))))
     (else
      (cons old
	    (multiinsertR new old (cdr lat))))))))
(define (multiinsertL new old lat)
  (cond
   ((null? lat) '())
   (else
    (cond
     ((eq? (car lat) old)
      (cons new (cons old
		      (multiinsertL new old (cdr lat)))))
     (else
      (cons old (multiinsertL new old (cdr lat))))))))


で、この3つに共通する点があって

   ((null? lat) '())
   (else
    (cond

ここの部分ですね。
以前書いた記事だと簡単に省略しちゃった

   (else
    (cond

このコード。理由は

   ((null? lat) '())

が真のときこれ以下のコードは評価されることがないからだったんだが…。

同じ理由でいくと省いてもよさそうなんだけど、なんでだか省くのをためらわれる。
可読性というかそれなりに意味があるから…。

   ((null? lat) '())
   (else

これはlatに関する2つの質問で「latはnullか」という質問と「latは1つ以上のS式から成り立つリストであるか」という質問だと思うんですよね。
恐らくは今後も似たようなパターンに出会うと思うんだけど、見た感じとちょっと動かしてみた感じだとこの部分の

   (else
    (cond

はあってもなくてもいいと思うんです。(多分全体としての意味合いは変わらない?)
だけど、可読性を考えるとあった方がいいのかなぁと思ったりもする今日この頃。

Scheme手習い

Scheme手習い