by shigemk2

当面は技術的なことしか書かない

リスト遊び 8-1 cons の特性

前回
リスト遊び 7-5 while と 再帰 - by shigemk2

まずはこれを見てほしい。
前に実装したreplのプログラムである(下にも書いた)
リスト遊び 7-2 while - by shigemk2

(defun repl (lst old new)
  ;; *1
  (let (tmp ret)
    (while lst
      (cond
       ((eq old (car lst))
	(setq tmp (cons new tmp)))
       (t (setq tmp (cons (car lst) tmp))))
      (setq lst (cdr lst)))
    ;; *2
    (while tmp
      (setq ret (cons (car tmp) ret))
      (setq tmp (cdr tmp)))
    ;; *3
    ret))
repl
(repl '(1 2 3) 2 5)
(1 5 3)
;; 引数のリスト'(1 2 3)について、
;; tmp に一度リスト'(3 5 1)を作成し、
;; ret にリスト'(1 5 3)を移す
;; これってセルを無駄遣いしているコードだということが
;; 分かるだろうか。

上記のコードはリソースを無駄遣いしているので、
どうしたらリソースを節約出来るかを考えてみよう。

consについて
consはセルを生成し、第一引数をそのセルのCARで指し、
第二引数をCDRで参照させる関数だった。
consの最も大事な利用方法は、ある要素をあるリストの先頭に追加することで
ある。
このようなconsの動作は、より安全であると言われている。
なぜ安全なのだろうか。

(setq zoo '(dog pig))
(dog pig)
(setq goo (cons 'rat zoo))
(rat dog pig)
zoo
(dog pig)

上を見たら分かるように、変数zooの中身は'(dog pig)で、
gooはzooにratをconsしているわけだが、
もとのzooの中身は破壊されない。
そのため、consは他の変数の値を破壊しないので、
安全であると言われている。

zooとgooは独立したリストではなく、うまく共存している。

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)