canlisp は MacLisp 系の lisp 言語である。いやまて、MacLisp 系と言うのは canlisp のような超小型の lisp が称するのはちょっと大胆である。が、とりあ えず defun 構文や defmacro に関しては MacLisp および Franz Lisp に見 られる方式を用いている。
canlisp の言語処理を lisp 言語の視点から言うと、深い束縛を持ち、レキシ カルスコープを持った言語と言うことになる。レキシカルスコープは Zeta Lispや Common Lisp で見られるスコーピングルールで、コンパイラに主眼を 置いたものであるが、canlisp はインタプリタであるにもかかわらず採用した。
とは言っても、たかだか日本語入力システムのカスタマイズファイルパーサで あるので、それほどたいしたことはしていない。canlisp の変数は大域で定義 されるか、ローカルバインディングがなされるかで、いわゆるスペシャル 変数( (declare (special x)) の x のような変数)は用意しない。
データの内部表現に関しては Utilisp の影響を受けている。データ表現はデー タを指すポインタにデータの種別を判別するためのタグを備えるポインタタグ 方式を採用した。またガーベジコレクションも Utilisp と同じコピー方式を 用いている。Utilisp では高速化のためにこれらの手法が取られているが、 canlisp では単に処理が楽だからと言う理由で採用した。
ところで、canlisp では文字型データの記述法や
global-set-key などのキーワードが
GNU Emacs Lisp の影響を受けている。ただし、細部に違いがあるので注意された
い。例えば、GNU Emacs Lisp ではコントロールバックスラッシュ
(^
)を表すのに、
?¥C-¥¥
と記述するが、canlisp では、
?¥C-¥
と記述する。また、ローカルキーマップにおいてキーに機能を割り付けるのに GNU Emacs Lisp では define-key を用いるが canlisp では set-key を用いる。
canlisp を設計するにあたって、できるだけ処理系が小さくなるように心掛け た。と言うのは、canlisp はそもそも『かんな』のパーサにすぎず、それ以上 の何者でもないからである。この方針にしたがってデータ型も最少のものを準 備するにとどめた。また、組み込み関数も非常に基本的なものに押さえ、主に カスタマイズ処理にかかわるものに主眼を置いた。
そのため、例えば FUNARG 問題は全く解決していない。だいたいにして、 eval、apply、 funcall を準備していない。著者は upward/downward の両方 を解決する closure やそれをベースとした、手続きをも組み込んだオブジェ クトなどに興味があるが、canlisp ではそこまで踏み込まない。
canlisp は lisp reader を含めて 4000 行 程度の プログラム である。 canlisp の処理系は ファイル lib/canna/lisp.[hc] にて定義されている。