実践CommonLisp:シンタックスとセマンティクス

二つのブラックボックス

lispには二つのブラックボックスがあって、ひとつは読取器(reader)、ひとつは評価器(evaluator)。
読取器は文字列をS式というLispオブジェクトへ変換する。
評価器はS式から組み立てられるLispフォームを決める。

S式

ひとつはアトムで、ひとつはリスト。

アトム

数値、文字、文字列、それにシンボル。

リスト

アトムを括弧で囲い表現する。

変換

読取器は文字列を読み込み、名前のあらわすオブジェクトを作るのみ。

シンボルオブジェクトへの変換
  • 名前を大文字に変換する。
  • 同一の名前をいつも同じシンボルとして読むことを保証する。

Lispフォーム

評価規則

正規のLispフォームとは以下を指す。

  • 任意のアトム
  • 先頭要素がシンボルになっているリスト
アトム

シンボルと、それ以外からなる。
シンボルは変数のな前とみなされ、変数の現在の値として評価される。
シンボル以外のアトムは、自己評価型(self-evaluation)のオブジェクト。
そのままで評価される。たとえば数値。たとえば文字列。
シンボルが名前にシンボルそのものを代入すれば自己評価型になる。例えば、キーワードシンボル。

CL-USER> :a
:A
リストの評価

関数呼び出し、特殊オペレータ、マクロのいずれかであると判断される。(定義されていないシンボルが先頭にきた場合は、関数名とみなされる)

関数呼び出しは、先頭以外のリスト要素を評価し、結果の値を関数に渡す。

(function-name argument*)

特殊オペレータは、関数にはできないことをする。
例えばQUOTEは、引数として1つの式をとり、評価せずに返す。

CL-USER> (quote a)
A

これには特別なシンタックスが用意されている。

CL-USER> 'a
A


マクロは、言語のシンタックスを拡張することができる。
マクロの評価は二段階で進行する。

  1. 要素を評価せずマクロ関数に渡す(=展開)
  2. 返されたフォームを通常手順で評価する