Lispプログラミング 第2回


第6章 条件分岐(cond)を使った関数定義の例

 

  1. 「与えられた2次方程式が実数解をいくつ持つか」は、判別式の符号を調べれば分かります。
  2. 小学校の低学年では、正の整数のわり算をする時、商と余りを求めました。
    Common Lispのシステム関数では、わり算の結果は整数または分数になるので、
    新たに、正の整数のわり算を行い、割り切れない時はリスト形式で商と余りを返す関数を作りましょう。
    (defun divide (x y)
          (cond ((= (mod x y) 0)   ;もし、xがyで割り切れるなら、
                 (/ x y))
                (t                 ;それ以外(割り切れない)なら、
                 (list (/ (- x (mod x y)) y) (mod x y)))
          ))

 

第2回の課題に必要な関数

CommonLispには、単純な条件分岐を行うifという関数もありますが、より一般的な関数としてcondがあります。
(cond (条件1 実行部1)(条件2 実行部2) ...(条件n 実行部n))
※実行部には複数の命令を書くことができます。
※条件2をチェックする時には、「条件1以外の場合で」ということが前提となっています。
※条件部の最後には、「それ以外の場合」に相当する t を書くことができます。
※cond関数の値としては、該当した条件の実行部の最後の値を返します。

条件部には、例えば、次のような論理関数を用います。
命令の基本形 関数の結果 使い方の例 結 果
(> n1 n2) n1 > n2 か? (> 5 4) t [真]
(< n1 n2) n1 < n2 か? (< 5 4) nil
(= n1 n2) n1 = n2 か? (= 5 6) nil
(atom x) x は、アトムか? (atom 'A),(atom '(A)) t[真],nil
(null x) x は、nil か? (null 'A),(null nil) nil ,t[真]
(equal x y) x と yは同じか? (equal 'A 'B),(equal '(P) '(P)) nil ,t[真]
※n1, n2は数に限ります。x, yは任意のアトムまたはリストです。

演習1 演習2 


戻る