Powered by SmartDoc

lisp の式と計算

lispに置ける「式」とは、要するにS-式のことです。lispは、S-式を与えると、その式の値を計算して、その結果を返すようになっています。

S-式には、上述したようにatomとlistがあり、それぞれ、意味が異なります。

atom の値

atomの値は次のようになっています。

数値atom

これは、それ自身の表す数値が、値となります。

実際、単に数値atomを単独に入力して、改行すると、それそのものが値として表示されます。

ただし、分数の場合は、約分された結果が値となります。

Symbol atom
これには、更に次の可能性があります。
予約語
予め、値が決められているatomで、ここではいくつかの例を挙げるだけに留めておきます。
T
値はTで、これは、lispの世界での真偽値の「真[true]」を表します。
NIL
値はNILで、これは、lispの世界での真偽値の「偽[false]」を表します。実は、"()" (空List)と同じものとして扱われます。
PI
値は、π(円周率)の近似値3.14159です。
予約語以外

予約語以外のsymbol atomは、「変数」と見なされます。

「変数」の値は、設定されている場合と設定されていない場合があり、設定されている場合は、その「設定されている値」が、「symbol atomの値」になります。

逆に、設定されていない場合は、「誤り(error: unbound variableと表示される)」となります(任意のsymbol atomに好きな値を割り当てる方法は、後述。)。

[演習1.3.1]
次の数値atomの値を求めなさい。
  1. 1
  2. -4/6
  3. 1.00
[演習1.3.2]
次のsymbol atomの値を求めなさい。
  1. T
  2. NIL
  3. PI
  4. NandakaWakaranai
  5. symbol-atom

list の値

listは、空list (要素を一つも含まないlist "()" )か、空list以外のlist (要素を少なくても一つは含んでいるlist )かの、どちらかで、空listの値はNILです。

空list以外のlistは「関数の計算」を表していると見なされます。

そして、listの最初の要素は、「関数名」を、残りの要素( 0個も有り得る)は、その関数の引数(ひきすう)(13)として扱われます。

「関数名」は、通常は、symbol atomで、しかも、そのatomがどのような関数を表しているかは、予め割り当てられている必要があります(任意のsymbol atomに好きな関数を割り当てる方法は、後述)。

もし、最初の要素が、symbol atomではなかったり、あるいは、それに、関数が割り当てられていなかった場合は、「誤り」になります。

Listの二つ目以降は、関数の引数となりますが、引数は、予め「評価(14)」され、値が計算された後に、関数の引数として渡されます。

例えば、1 + 2 * 3を表すlist "(+ 1 (* 2 3)"を考えてみましょう。

これは、三つの要素"+", "1", "(* 2 3)"からなります。ここで、最初の要素"+"は、確かにsymbol atomであり、実は、最初から「足し算」を行う関数が割り当てられています。そして、それの二つの引数が"1"と"(* 2 3)"なわけです。

従って、このlistの値を計算するためには、「足し算をする関数が呼び出す」わけですが、その前に、引数となる"1"と"(* 2 3)"の値が計算されます。"1"の値は、これが数値atomなので、数値の1が値ですが、二つ目の引数は、再びlistなので、その値は、関数の計算の結果となります。

ここでは、もちろん、listの最初の要素が"*"で、「掛け算」が割当ててあり、引数の"2", "3"の値もそれぞれ、数値の2, 3なので、結果は、6となり、それが、足し算の計算に渡されるわけです。

つまり,一般的には、「括弧の内側から計算される」という「原則」があります。

なお、関数には、予め、引数の個数や、その種類があります。その個数や種類が間違っている場合も、「誤り」となります。

[演習1.3.3]
次のlistの値を求めなさい。
  1. ()
  2. (+ 1 2)
  3. (mod 5 2)
  4. (mod 5 2 9)
  5. (1)
  6. ((+ 1 2) 3 4)
  7. (NandakaWakaranai)
  1. 本当は、「引き数」と書くべきか。「引数」を「いんすう」と呼ばないのは、「因数(分解)」の「いんすう」と紛らわしいので、「こう発音するのだ」と先輩に教わった記憶があります。
  2. その「表現」の「値」を求めること。「式」は「表現」であることに注意。