lispの関数には、条件判断を行い、その結果として、真偽値(真[条件が成立するという値... Tになる]と、偽[条件が成立していないという値... NILになる] )を返す関数があります。
関数名 | 名称 | 引数の個数 | 関数の値 |
---|---|---|---|
= | 等しい | 2 | 2つの引数の値が等しければ真[T]、そうでなければ偽[NIL](以下同様) |
/= | 等しくない | 2 | 2つの引数の値が異なれば真[T] |
< | 小さい | 2 | 一つ目の引数の値が二つ目の引数の値より小さければ真 |
<= | 以下 | 2 | 一つ目の引数の値が二つ目の引数の値以下(等しいか小さい)ならば真 |
> | 大きい | 2 | 一つ目の引数の値が二つ目の引数の値より大きければ真 |
>= | 以上 | 2 | 一つ目の引数の値が二つ目の引数の値以上(等しいか大きい)ならば真 |
関数名 | 名称 | 引数の個数 | 関数の値 |
---|---|---|---|
zerop | ゼロ判定 | 1 | 引数の値が0ならば真 |
numberp | 数判定 | 1 | 引数の値の形式が数値形式ならば真 |
plusp | 正判定 | 1 | 引数の値が正の数ならば真 |
minusp | 負判定 | 1 | 引数の値が負の数ならば真 |
null | NIL判定 | 1 | 引数の値がNILならば真 |
atom | atom判定 | 1 | 引数の値がatomならば真(19) |
listp | list判定 | 1 | 引数の値がlistならば真 |
関数名 | 名称 | 引数の個数 | 関数の値 |
---|---|---|---|
eq | 同一性比較( identity ) | 2 | 二つ引数の値が同じ物ならば真 |
equal | 同一形式( equality ) | 2 | 二つ引数の値が同じ表現ならば真(21) |
eqとequalの二つの区別はし難いかもしれませんが、例えていえば、「双子は、equal (同じように見える)だが、eq (同一人物)ではない」というところでしょうか..。
一般に、eqなら、equalが常に成立するのですが、その逆は、成立するという保証がありません。
実際、atomは、equalならeqが言えるのですが、listの場合は、equalだからといって、eqが言えないことがほとんどです。(偶然言えることもありますが.. )。
結論からいえば、「普通は、equalを使うのが無難」で、まあ、eqは使わないということでしょうか。
与えられた真偽値から新しい真偽値を計算する演算を論理演算と呼びます。
関数名 | 名称 | 引数の個数 | 関数の値 |
---|---|---|---|
and | かつ(論理積) | 0...(26) | 引数のどれかの値がNILなら偽[NIL]。そうでなければ、NIL以外(27) |
or | または(論理和) | 0... | すべての引数の値がNILなら偽[NIL]。そうでなければ、NIL以外(28) |
not | でない(否定) | 1 | 引数の値がNILなら真(29) |
真偽値を利用して、挙動を変えたい時があります。その場合に利用するのが、以下の関数です。
関数名 | 名称 | 引数の個数 | 関数の値 |
---|---|---|---|
if | もし | 2か3(32) | 一つ目の引数がNILなら、全体の値は、三つ目の引数の値そうでなければ、二つ目の引数の値(33) |
cond | 多条件分岐 | 0 .. | condの引数は「二つの要素を持つList」の形を想定しています。condの値は、次のように計算されます。 最初のList引数の最初の要素の値がNILでないならば、そのListの二番目の値、そうでなければ、次の要素の最初の要素の値を調べる、以下、同様。 |
myifという関数を次のように定義した
(defun myif (condition then else) ( if condition then else ) )
すなわち、「myifは、ifの私家版」としたい。これは巧く行くだろうか?
巧く行かないとしたら、問題となる例はどのような場合か?
(少し難しい)
同様に、if, condの代わりに、andとorの両方を利用して、pos-numを定義してみなさい。
より正確には、「引数を評価した値」となります。実は、次のcond (や、実は、andやorなどや、defunなど.. )もそうですが、ifは、普通の関数とは異なり、呼び出される前に引数の値が評価されません(逆に、われわれがdefunで定義する関数は、全て、呼び出される前に引数の評価が行われています)。評価が行われるのは、関数が呼び出された後に、今回の例にあるように、必要に応じて、積極的に評価が行われます。従って、逆にいえば、引数の中には評価されないままのものも生じる可能性があるということです。
これは、奇異に感じるかもしれませんが、このような仕組みの必要性は、「演習1.7.4」をやってみれば解ると思います。