lispのif文の使い方【cond,whe,unless,progn】

lispのif文の使い方

Lispのif文は以下のように使われます。

(if 条件 式1 式2)

この式は、条件が真である場合は式1を評価し、条件が偽である場合は式2を評価します。 例えば、以下のようなLispのif文があります。

(if (> x 0) (print "x is positive"))

この場合、xが0より大きい場合にのみ、"x is positive"が出力されます。

lispのif文の特殊性

Lispのif文は特殊形式であり、条件の評価結果に応じて評価する式を決定するため、他のプログラム言語でよく見られる条件演算子とは異なります。したがって、注意する必要があります。

注意点として、Lispのif文は必ずしも2つの式を評価する必要はなく、条件が真である場合に評価される式は1つだけであっても構いません。また、条件が偽である場合の式が省略された場合、if式全体はnilを返します。

例えば、次のようなコードはエラーにはなりません。

(if (odpdp 5)
    `odd-number
    (/ 1 0))

lispのprognの使い方

prognは、複数の式を一つの式として評価するために使用されます。prognは以下のように使用されます。

(progn 式1 式2 ... 式n)

この式は、式1から式nまでのすべての式を評価し、最後の式の値を返します。prognLispの特殊形式の一つであり、プログラムの制御構造を変更するための様々な手段を提供します。

prognの注意点として、すべての式が評価されるため、最後の式が返す値が最終結果となります。また、progn内の式を括弧で囲む必要はありませんが、視認性のために括弧で囲むことが一般的です。

例えば、以下のようなLispprognがあります。

(progn
  (print "Hello,")
  (print "world!"))

この場合、"Hello,"と"world!"が順番に出力され、最後の式(print "world!")が返す値(nil)が最終結果となります。

whenとunlessとcond

Lispには、if文とは別に、より簡潔に条件分岐を表現するための特殊形式がいくつかあります。そのうち、when、unless、condについて説明します。

when

whenは、条件が真の場合に式を評価する特殊形式です。以下のように使います。

(when 条件 式1 [式2 ...])

条件が真の場合、式1から式nまでの式を評価します。式1から式nまでの式は、複数指定できます。whenは、if文と似た動作をしますが、条件が偽である場合は何も評価しません。when式自体は、評価した最後の式の値を返します。

例えば、以下のようなLispwhenがあります。

(when (> x 0)
  (print "x is positive")
  (print "x is greater than zero"))

この場合、x0より大きい場合に、"x is positive""x is greater than zero"が順番に出力されます。

unless

unlessは、条件が偽の場合に式を評価する特殊形式です。以下のように使います。

(unless 条件 式1 [式2 ...])

条件が偽の場合、式1から式nまでの式を評価します。式1から式nまでの式は、複数指定できます。unlessは、whenと同様に、if文と似た動作をしますが、条件が真である場合は何も評価しません。unless式自体は、評価した最後の式の値を返します。

例えば、以下のようなLispunlessがあります。

(unless (> x 0)
  (print "x is not positive")
  (print "x is less than or equal to zero"))

この場合、x0以下の場合に、"x is not positive""x is less than or equal to zero"が順番に出力されます。

cond

condは、複数の条件式に対してそれぞれの場合に式を評価する特殊形式です。以下のように使います。

(cond (条件1 式1 [式2 ...])
      (条件2 式1 [式2 ...])
      ...
      (t 式1 [式2 ...]))

cond式は、上から順に各条件式を評価します。条件式は、先頭に評価される式が真である場合に、その条件式の残りの式を評価します。tという シンボルは、Lispで真と見なされる特殊なシンボルです。最後の条件として、tを指定することで、それ以外の全ての条件が偽の場合に、式1から式nまでの式を評価します。式1から式nまでの式は、複数指定できます。cond`式自体は、評価した最後の式の値を返します。

例えば、以下のようなLispcondがあります。

(cond ((= x 0) (print "x is zero"))
      ((< x 0) (print "x is negative"))
      ((> x 0) (print "x is positive"))
      (t (print "x is not a number")))

この場合、xの値によって、4つの条件式のうち評価される式が決まります。x0の場合は"x is zero"が、xが負の数の場合は"x is negative"が、xが正の数の場合は"x is positive"が、それ以外の場合は"x is not a number"が出力されます。