そういえば、lisp の and と or は、 C言語とかの論理演算子(&& ||)と違って、多項で使える(3個以上の引数を取れる)。
はまりそうだから覚え書きしておく。
and の例
; 左から評価していき、 (and 1 2 nil 4 5) nil ; ひとつでも 偽 を見つけると、そこで評価をやめて nil を返す (and 1 2 3 4 5) 5 ; 最後まで 偽 が見つからなかったら、最後に評価した結果を返す ; t を返したりしない
or の例
; 左から評価していき、 (or nil nil 3 4 5) 3 ; ひとつでも 真 を見つけると、そこで評価をやめて そのとき評価した結果を返す ; t を返したりしない (or nil nil nil nil) nil ; 最後まで 真 が見つからなかったら、nil を返す
ちなみに not は 1つしか引数をとれない。(そりゃそうだ)
; 返すのは nil か t のどちらかのみ (not 'a) nil (not nil) t
まあこいつらは if の中で Cっぽく使うぶんには問題ないんだが、マクロで ,@(a b c)とかしたのを引数として与えると、十分ハマれそうではある。
lispっぽく書こうとすると、今までの Cっぽい考え方を脱皮する必要があるわけで、しばらくの間はこういう細かなことを確かめながら歩く必要がありそうだ。
はぁ、なんか復習すべきことが多すぎて疲れてきた。
いかに今までいい加減にやってきたか思い知らされる。