Paul Graham が言っていたこと
On Lisp で Paul 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"))