Lisp勉強中(5) 比較
やっとプログラムらしくなってくるのを覚えた。
trueかfalseかを調べる
これはよく使う。
まずはequal関数。引数が同じ値かどうかを調べる。
; 一致するときは t が返る (setq a 1) =>1 (setq b 1) =>1 (equal a b) =>t ; 一致しないときは nil が返る (setq b 2) =>2 (equal a b) =>nil ; リストも比較できる (equal '(1 2 3) '(1 2 3)) =>t ; 型が合わないと一致しない (setq b 1.0) =>1.0 (equal a b) =>nil ; 型が合わなくても一致させたいときは equalp (equalp a b) =>t
他にeqとeqlというのがあって、eqはまったく同じオブジェクトを参照してる場合にtを返す。eqlは、equalに似てるけどリストや文字列は比較できない。
どうやって使い分けようかなあ。
もっとある
; 引数の数値が全部同じなら t (= 1 1 1) =>t ; 引数の数値が全部ちがうなら t (/= 1 2 3) =>t ; だんだん増えていれば t (< 1 2 3) =>t ; だんだん減っていれば t (> 3 2 1) =>t ; 減らなければ t (<= 1 1 2 2 3 3) =>t ; 増えなければ t (>= 3 3 2 2 1 1) =>t
これらは引数をたくさん渡せるのが特徴。数値型に使う。型があわなくても大丈夫っぽい。
andとor
(and (= 1 1) (= 2 2) (= 3 3)) =>t (and (= 1 1) (= 2 2) (= 3 4)) =>nil (or (= 1 2) (= 3 4) (= 5 5)) =>t (or (= 1 2) (= 3 4) (= 5 6)) =>nil
andは引数が全てtならtを返し、それ以外はnilを返す。orは引数がどれかひとつでもtならtを返し、全てnilならnilを返す。
どちらもショートサーキット。andは引数にnilを見つけたらそれ以降の引数は評価しない。orは引数にtを見つけたらそれ以降は評価しない。
not
(not t) =>nil (not nil) =>t
notで真偽をひっくり返す。まあ簡単。
これで分岐が出来る
比較ができるようになったので、条件によって分岐させることができそう。
分岐はif、when、unless、condなどいろいろあるっぽい。うーん、今日はもう眠いので終わり。