新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Paul Graham が言っていたこと

On LispPaul Graham が car や cdr の美しさと setf の有益さを語っていたが(たぶん)、いまいちピンとこなかった。さっきプログラムしていて

(list (list 'status (some-fuction)))

とするとなんだかわからんが、、、、

(let ((rv '((status nil)))
   (setf (cadar rv) (some-function)))

とするときれいに描けることに気が付いた。これって HTML だか JavaScript だかで使われるテクニックだよね。
プレスフォルダーをつくっておいてあとから入れ込むテクニック。

きっと lisp では10年以上前からそんなことしているわい。といいたいのだろう。

とおもったら、だめじゃん。(ばぐあり)上のようには使えない。どうすればよいのだ、、、

あと、プログラムしていると自分で list を組み立てて評価したくなる。あ〜これってマクロじゃないか、、、と妙に感心した。

後日:copy-list を使えばいいことに気が付いた

(defun bug-list (a b c)
   (let ((rv '(a b c)))
     (setf (car rv) a (cadr rv) b (caddr rv) c)
     rv))

(defun ok-list (a b c)
   (let ((rv (copy-list '(a b c))))
     (setf (car rv) a (cadr rv) b (caddr rv) c)
     rv))

(setf bug (list (bug-list "a" "b" "c")
                (bug-list "o" "p" "q")
                (bug-list "x" "y" "z")))

(setf ok  (list (ok-list "a" "b" "c")
                (ok-list "o" "p" "q")
                (ok-list "x" "y" "z")))

(format t "bug:~s~%" bug)
(format t "ok :~s~%" ok )

結果は

bug:(("x" "y" "z") ("x" "y" "z") ("x" "y" "z"))
ok :(("a" "b" "c") ("o" "p" "q") ("x" "y" "z"))