Schemeの例題 --- (9)

Copyright(C)2014 by 桜川貴司

Lisp in Lisp

Lispのような言語では、その言語あるいはサブセット、それらの類似言語の インタプリタをその言語自身で比較的容易に記述することができる。 そのように記述したプログラムのことを、その言語名-in-その言語名などと 呼んだりする。例えばLispの場合、Lisp-in-Lispなどという。 他に同様のことを容易に行える言語としてはPrologを挙げられる。

ここではあるLispのインタプリタをSchemeで実現したものを示す。 Schemeの場合、Schemeのサブセットを実現していればScheme-in-Schemeと呼ぶのが適当だろうが、 ここで挙げるものは意味がサブセットから異なっている部分があるため、 正確にはLisp-in-Schemeである。ただしSchemeもLispの一種なので、 Lisp-in-Lispと呼んでよいと考えられる。

lisp-in-lisp.scm

以下のような特徴がある。

しかし、オプションでない課題であって、 上の制限に引っかからないものの多くは実行可能である。 実際に動作するかどうかいくつか試してみてほしい。 実行例はプログラムのヘッダの部分にある。 そして、それらの実行がどのように行われるかを考察してほしい。 たったこれだけのプログラムを読めば、 Lispインタプリタの動作の概要を理解することができる。

Lisp-in-Lispでも、言語仕様を限定するなどしてなるべく記述量を少なくすることを目標としている場合と、 そうでない場合がある。 ここで挙げたものは、 それよりは実用的なインタプリタの動作に少し近づけたものになっている。 そのため記述量は最小ではない。 例えばここで挙げたものの場合、組み込み関数を追加し、それを呼び出すように書ける。 記述量を減らすことを第一目標としている場合には、例えばLispの基本5関数から成るS式のみを評価可能だったりする。

まだ十分にテストもできていないため、 問題点があれば指摘していただけると助かります。

kadai20-kadai22のページへ