quoteだと展開されないので…
lispを真面に勉強した事が無いので、基礎が出来ていない。雰囲気でカスタマイズしてきたので、色々と困る事に直面する事がある。
何時も、その場で調べてなんとなく納得して、その後、調べた内容を忘れてしまうというパターンなので、今回はメモっておく事にする。
初期設定ファイル等でイミディエイト記法でコンスセルとかリストが書かれている事が多々ある。例えば
'(height . 40)
のような感じ。でも、ここで、40を変数にしたい時がある。しかし、
(setq MyWindow-height 40) '(height . MyWindow-height)
と記述してもMyWindow-heightは展開されない。特殊形式quote(')は、一つの引数を、書かれたとおり、評価をせずに 返すから。なので、ここでは
(cons 'height MyWindow-height)
と記述する必要がある。
(cons 'height MyWindow-height) => (height . 40) '(height . 40) => (height . 40)
の通り、両方共に同じ結果が得られる事が確認できる。
で、次の例題。勿論 "gtd.org" を変数にしたいのです。
'(("gtd.org" :maxlevel . 1) ("someday.org" :level . 1))
外側はlistなのは解る。内側はドットが入っているのでコンスセルなのは解るが、その前は…
実はこれはコンスセルのコンスセルなのです。
(list (cons "gtd.org" (cons :maxlevel 1)) (cons "someday.org" (cons :level 1)))
と記述できる。
'(("gtd.org" :maxlevel . 1) ("someday.org" :level . 1)) => '(("gtd.org" :maxlevel . 1) ("someday.org" :level . 1)) (list (cons "gtd.org" (cons :maxlevel 1)) (cons "someday.org" (cons :level 1))) => '(("gtd.org" :maxlevel . 1) ("someday.org" :level . 1))
双方同じ結果が得られる事が確認できる。
因にコンスセルを数珠繋ぎにして、最後を nil で終了させたものがリストである。
(cons 1 (cons 2 (cons 3 nil))) => (1 2 3) (list 1 2 3) => (1 2 3) '(1 2 3) => (1 2 3)
先の例は、最後が nil で終了していないパターン。
(cons 1 (cons 2 3)) => (1 2 . 3) '(1 2 . 3) => (1 2 . 3)