lispに置ける「式」とは、要するにS-式のことです。lispは、S-式を与えると、その式の値を計算して、その結果を返すようになっています。
S-式には、上述したようにatomとlistがあり、それぞれ、意味が異なります。
atomの値は次のようになっています。
これは、それ自身の表す数値が、値となります。
実際、単に数値atomを単独に入力して、改行すると、それそのものが値として表示されます。
ただし、分数の場合は、約分された結果が値となります。
予約語以外のsymbol atomは、「変数」と見なされます。
「変数」の値は、設定されている場合と設定されていない場合があり、設定されている場合は、その「設定されている値」が、「symbol atomの値」になります。
逆に、設定されていない場合は、「誤り(error: unbound variableと表示される)」となります(任意のsymbol atomに好きな値を割り当てる方法は、後述。)。
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となり、それが、足し算の計算に渡されるわけです。
つまり,一般的には、「括弧の内側から計算される」という「原則」があります。
なお、関数には、予め、引数の個数や、その種類があります。その個数や種類が間違っている場合も、「誤り」となります。