Powered by SmartDoc

関数の定義

listを評価する場合、listの最初の要素は、関数を表すsymbol atomであり、そのsymbol atomがどのような関数であるかは、予め割り当ててある必要がありました。

ここでは、任意のsymbol atomに好きな関数を割り当てる方法について説明します。

常に 1 を返す関数 one

まずは、小手調に、引数のない関数(これを定数関数と呼びますが.. )を次のように定義します。

(defun one () 1)

この結果、表示されるのは、"one"というsymbol atomですが、これで、oneという関数が定義されます。

(one)

とすれば、1という値が計算されます。なお、

one

としても駄目であることに注意しましょう。また、

(setq one 2)

としても、"(one)"の値は、1のままであり、逆に、"one"の値は、2になることも確かめましょう(16)

定数関数 one の定義
> (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.5.1]
常に10を返す関数tenを定義せよ
  1. つまり、変数と関数の入る場所が異なるということです。

一つの引数を持ち、これに 1 を加えた値を返す inc

次に、一つの引数を持ち、これに1を加えた値を返すincを返す関数を定義します。つまり、"(inc 1)"は、2, "(inc 10)"は、11になります。

(defun inc (n) (+ n 1))

ここで、前節のoneとの違いは、「引数があるので、その引数に"n"という変数名を付けている」という点です。

1 変数関数 inc の定義
> (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が、「自動的かつ、一時的に設定される」わけです。

[演習1.5.2]
実際にincを定義し、次の値を計算しなさい。
  1. (inc 1)
  2. (inc 10)
  3. n
[演習1.5.3]
次のような一引数関数を定義しなさい。
  1. 引数から1を引いた値を返す関数dec
  2. 引数の2乗を計算するsquare

複数の引数を持つ関数の定義

三つの数の和を計算するadd3は次のように定義します。

(defun add3 ( x y z ) ( + x ( + y z ) ) )
1 変数関数 inc の定義
> (defun add3 ( x y z ) ( + x ( + y z ) ) )
ADD3
> (ADD3 3 4 5)
12
>
[演習1.5.4]
実際にadd3を定義し、次の値を計算しなさい。
  1. (add3 1 2 3)
  2. (add3 1 2 3 4)
[演習1.5.5]
次のような関数を定義しなさい。
  1. 二つの数の平均を計算するave
  2. 三つの数の積を計算するmul3

商を求める関数の定義

この節のまとめとして、商を計算する関数を定義してみましょう。すでに、述べたように、xlispでは、整数を整数で割った時に、余りが生じる場合は、商ではなく、分数値を返します。

そこで、割り切れない場合も、商を返すndivを定義してみます。これは、次のようになります。

商を求める ndiv の定義
> (defun ndiv ( x y ) (/ (- x (mod x y)) y)
NDIV
> (ndiv 123 45)
33
>