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などいろいろあるっぽい。うーん、今日はもう眠いので終わり。