Common Lisp など、Lisp の言語仕様が定めているのは、入力するテキスト文書の書式だけであり、そのシステムについては実装に委ねられています。 ある Lisp システムはコンパイラかもしれませんし、インタプリンタ、または中間言語を採用しているかもしれません。 教育用の Lisp システムの場合は、昔の BASIC システムのようにコマンドによる対話形式を採用しているものも多く存在します。 この場合、プロンプトのように Lisp 言語で書かれた式を入力して、計算結果を出力するという単純な対話です。
> 式
ずばり、Lisp の基本はこれだけです。 式には、Lisp システムに計算させるべき数値などの処理対象のデータを入力します。 Lisp は定められた手順に従ってコードを実行し、得られた結果を出力してくれます。 通常、Lisp システムに入力する1つの式は、複数の関数から成り立ちます。
Lisp システムは入力された関数を順に評価し、その結果を表示します。 関数とは、何らかの仕事を行う処理コードの集まりで、いくつかのデータを受け取り、そのデータを処理して結果を返します。 このとき、関数が受け取るデータを引数と呼び、関数が返すデータを関数の値と呼びます。 関数を呼び出す式は次のような形になります。
( 関数名 引数1 引数2 ...)
関数式は、必ず ( ) で囲み、最初に関数の名前を、その後に引数を指定します。 関数名や引数の数は関数によって異なります。 関数名と引数の間は、必ず 1 つ以上の空白文字で区切らなければなりません。 引数を複数個受け取る関数の場合は、引数と引数の間も空白文字で区切ります。
Common Lisp では、システムがあらかじめ提供しなければならない標準関数を定めています。 例えば、単純な演算を行う関数として、加算を行う +、減算する -、乗算する *、除算する / 関数などが存在します。 これらの演算用関数を使って Lisp プログラムを実行すると、次のようになります。
> (+ 10 20) 30 > (- 10 20) -10 > (* 5 12) 60 > (/ 30 5) 6
これらの演算用関数には、演算対象のデータを引数として入力します。 関数は、与えられた引数のデータを計算し、その結果が関数の値となります。 Lisp は式の評価が終了すると、その式の値を出力しています。
具体的には、これらの演算用関数は次のように定義されています。
+ &rest numbers
- number &rest more-numbers
* &rest numbers
/ number &rest more-numbers
&rest は関数定義におけるオプションで、これは任意の数の引数を受けることができるということを表しています。 つまり、+ 関数と * 関数は、0 から加算、または乗算したいデータを任意の数だけ指定することができます。 これに対し - と / 関数は第一引数 number は必須で、必ず数値を最初の引数に指定しなければなりません。 その後の引数の数は任意です。
> (+ 1 2 3 4 5) 15 > (- 100 10 1) 89 > (* 1 2 3 4 5) 120 > (/ 100 10 2) 5
これは、2 つ以上の引数を指定した場合です。 すべて、左側の引数から順に計算されていることがわかります。 因みに + と * は引数を指定しなくても関数の値を得ることができます。 引数を省略した場合 + 関数は 0、* 関数は 1 という結果を返します。
関数は最終的に値を返すため、関数の引数に関数式を指定することができます。 + や - といった関数では、加算や減算などごく単純な結果しかえることができませんでした。 しかし、実際には様々な計算が必要となります。 式の中に別の式を含めることで、より複雑な結果を算出することができるようになるのです。
> (+ (* 5 3) 5) 20
この Lisp コマンドは、+ 関数の引数で * 関数を呼び出し、関数の値を引数として指定しています。 この場合、プログラムはより内側の式を順に評価するため (* 5 3) を評価し、関数の値 15 を得ることができます。 そして、この 15 と 5 を加算しているため、結果は 20 となったのです。