OOPに対応したLisp処理系
last modify:011123 !!現在執筆中です!!


はじめに 〜Lispという言語〜

 LispはList Processing Language(?)の略とされ、リストを処理するためにMITで開発されました。そもそもなんでリスト処理か?というと、人間の頭の動きをモデル化する際、頭の中で人、馬、机、等の対象をシンボル処理しているモデルが考案されました。Lispはそのモデルを動かし検証するための言語として開発されましたのです。

リストの例
   (human 太郎 男性 温厚)
 すなわち、必要とされる用途がまず存在し、その用途に適するように作られた言語です。Lispは人工知能研究(AI)の盛り上がりと共に発展し、MITがルーツのMacLispから多くの方言が生まれました。そして言語の違いを統一したCommonLispへと進化しました。また言語を最速で実行するためのLisp専用コンピュータ(Symbolics)等も開発されました。しかし、人工知能研究の終息と共に、Lisp言語は表舞台に登ることはなくなりました。とはいえ、Lispから発展したScheme(guile?)はGnuでの標準スクリプトになる等、柔軟な表現能力が評価され、特定の分野では活躍が期待されています。

 Lispはその独特の表現に特徴があります。以下の例にあるようにカッコ()を使いまくった表記法です。最初の人はこのカッコとクオート(’引用符)でめげると思いますが、処理系の立場からすると、カッコで単語が囲まれれるが故に構文解析が不要になっています。人間に構文解析をさせているとも言えますね。

(defun talk(word)
  (cond ((equal word 'hello)
         'bye)
        ((equal word 'who)
         'foo)
        (t
          'tryMe)))

 Lisp言語を学ぶ意義というのは現在ではあまり無いかもしれませんが、EmacsやGnomeのカスタマイズなどでいろいろ役に立つかもしれません。Lisp言語を学ぶ一番効果的な方法はLisp自体でLisp処理系を書く事だと言われています。あるいはC言語等でLisp処理系を実装すると仕様がよく分かります。

 このページでは、過去に作成したLisp処理系のソースを公開しています。趣味として作っただけなのでToyProgramであり、処理速度は評価していません。Lisp処理系を作っていた頃、オブジェクト指向が流行っていたので、Lisp上でクラスが扱える拡張も加えています。また、Unix上でGUIが操作できるようにと、X11のライブラリ(Xlib)を呼び出してウインドウ等も出せるようにしていましたが、XlibのバージョンがX11R4から上がった時修正を反映していないので動作が不安定です。GUIを制御するスクリプトとしてTcl/Tk等もあり、あまり必要性がないのでメンテしていません。


外部仕様
  1. 基本仕様
    基本的にmacLispの仕様を参考にしていますが、実装関数などの点でコンパチにはなっていません。 また、一時期使っていた方言(standard Lisp)も入っています。関数詳細は別紙参照下さい。Lisp界の標準である、CommonLispですが、趣味で実装するには仕様が重すぎ、まったく参考にしていません。CommonLispを動かしたいのであれば、KCL(Kyoto Common Lisp)等をどこかから手に入れて下さい。
  2. 拡張仕様(その1)
    オブジェクト指向プログラミングを可能にするため、クラス定義、インスタンス生成関連の拡張を実装しています。具体的には、クラス定義関数のdefclass,インスタンス生成のmake-instance,メッセージ送信のsendです。OOPでお決まりの継承も実装しています。Symbolicsの拡張であるflavourを参考にしています。
  3. 拡張仕様(その2)
    メンテしていませんが、GUIを実現するため、X11のXlibを呼び出すようになっています。ウインドウやフォント指定、テキスト描画はXlibを使って行っています。バージョンの不一致により不安定ですが、参考にして下さい。Xlib関連の実装はUnix/Linuxでのみ有効です。WindowsだとWin32APIになるのでしょうか?
  4. デバッガ
    言語を使う側にとってデバッガは必須ですが、言語を開発する側にとってデバッガの実装が重荷です。いつも。この処理系では一応デバッガの機能もありますが、真剣に作っていないので使い物になりません。すみません。

内部仕様
モジュール仕様(未)
関数仕様(未)

公開ソース

 処理系のソースを公開します。バグや制限事項等は添付していますReadmeをご参照下さい。基本的にToyProgramですので、勉強用と割り切って下さい。なお、バイナリは含まれません。簡単なソースですのでgcc等で適当にコンパイルして下さい。Windows上でコンパイルする場合、Cygnusのgccを入れるか、あるいは、ボーランドのフリーコンパイラなどをお使い下さい。

Linux用(lisp_020101.tgz)(未)(漢字:EUC 圧縮:tar+gzip形式)
Windows用(lisp_020101.lzh)(未)(漢字:ShiftJIS 圧縮:lzh形式)

ご意見箱
メッセージボード(未)
コメント一覧(未)

付録
参考文献(未)

御意見、質問等は下記へどうぞ。

pml@plala.to

戻る