listを評価する場合、listの最初の要素は、関数を表すsymbol atomであり、そのsymbol atomがどのような関数であるかは、予め割り当ててある必要がありました。
ここでは、任意のsymbol atomに好きな関数を割り当てる方法について説明します。
まずは、小手調に、引数のない関数(これを定数関数と呼びますが.. )を次のように定義します。
(defun one () 1)
この結果、表示されるのは、"one"というsymbol atomですが、これで、oneという関数が定義されます。
(one)
とすれば、1という値が計算されます。なお、
one
としても駄目であることに注意しましょう。また、
(setq one 2)
としても、"(one)"の値は、1のままであり、逆に、"one"の値は、2になることも確かめましょう(16)。
> (one) error: unbound function - ONE > (defun one () 1) ONE > (one) 1 > one error: unbound variable - ONE > (setq one 2) 2 > one 2 > (one) 1 >
次に、一つの引数を持ち、これに1を加えた値を返すincを返す関数を定義します。つまり、"(inc 1)"は、2, "(inc 10)"は、11になります。
(defun inc (n) (+ n 1))
ここで、前節のoneとの違いは、「引数があるので、その引数に"n"という変数名を付けている」という点です。
> (defun inc (n) (+ n 1)) INC > (inc 3) 4 > (inc 33) 34 > n error: unbound variable - N > (setq n 20) 20 > n 20 > (inc 6) 7 > n 20 >
その後ろの"(+ n 1)"に現れる"n"というatom symbolには、"(inc 10)"などと書いた場合の引数の値10が、「自動的かつ、一時的に設定される」わけです。
三つの数の和を計算するadd3は次のように定義します。
(defun add3 ( x y z ) ( + x ( + y z ) ) )
> (defun add3 ( x y z ) ( + x ( + y z ) ) ) ADD3 > (ADD3 3 4 5) 12 >
この節のまとめとして、商を計算する関数を定義してみましょう。すでに、述べたように、xlispでは、整数を整数で割った時に、余りが生じる場合は、商ではなく、分数値を返します。
そこで、割り切れない場合も、商を返すndivを定義してみます。これは、次のようになります。
> (defun ndiv ( x y ) (/ (- x (mod x y)) y) NDIV > (ndiv 123 45) 33 >