お気楽プログラミング再開しました

4年くらい前に書いていたkissという名前のなんちゃってISLisp言語処理系をクラウドストレージから掘り出して、またいじりはじめました。

インタープリタとしてC言語で実装してありますね。setjmpなんかでLispのコントロール構造を実装してあります。

で、C言語なんですが、読めば一応わかりますが、重箱の隅は忘れているので、誉れ高いC言語のバイブルK&Rをネットで無料で調達して、リファレンスマニュアルをざっと確認しました。

いやー、いいですねプログラミングは…。

msys2をインストールして、gcc *.c でコンパイルしようとしたら、ワーニンングがたくさんでました。wchar_t関係ですね。で、頭にきたので全部charに変更して動くようにしました。昔ながらのstrcmpなんかが変な名前の関数使わなきゃいけないんでヤだったんですよね。

ただ楽しみのためだけにプログラミングすることにしました。

で、すでに偉そうにオブジェクトシステムとかジェネリックファンクションなんかも実装してあるので(そこで力尽きたみたいです)、ベクタとか残りを実装して、ノリでISOから規格書(約2万円!)もそのうち買って、規格準拠の処理系ですなんてすました顔して公開してみたいなと思っています。

 

ISLispインタープリタをC言語とISLispで実装する、その後2

Sketchyな実装ではあるもののオブジェクトシステム、ジェネリックファンクション、コンディションシステムの実装を終えました。私事ですこし開発が遅れていますが山場はこえたのでどうやらこれは形になったものを世間に公開できそうな雰囲気。

まぁ、締め切りがあるわけではないのでゆっくり行くつもりです。

とりあえず、現状をkiss-2012-09-12.zipとして公開しときます。gcc *.cでコンパイルして./a.exeで走るはずです。

ISLispインタープリタをC言語とISLispで書く、その後

自分用の書きなぐりではありましたが、読んでくださる方がいたので翌日朝(2012年8月22日)若干修正。

以前、失敗したにもかかわらず、自分(俺様)仕様LispのインタープリタをCで書いていました。しかし、結局ISLispからObject Orientedな部分とGeneric funcitonを除いたものに毛が生えた程度になってしまいあまりにも簡単すぎたので、それならとISLisp準拠を目指そうと書き直しています。

目的は、まず、自分にもISLisp処理系が書けた!ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイという感情を味わうこと。基本方針はKISS(Keep It Simple and Stupid)決してKeep It Short and Simpleとは言いません。バカなほど愚直な実装しか自分には書けないだろうと見積もったわけです。

デザイン指針は、まずC言語で小さなISLispの機能縮小版インタープリタを書きます。そこからISLispで書いた本格的なISLisp処理系を立ち上げ時にロードするというものです。”ISLispで書いた”と言いましたが実際は機能縮小版で実装されている部分と徐々にロードされていくISLispで書いた機能を使ってしか書けないわけです。だがいかにも自由にISLispでISLispを実装しているかのように書くのがミソというわけです。

そして実行速度は無視。インタープリタとしての機能を実現するコードの簡潔さと読みやすさを重視します。fixnumとポインタでビットを立てて区別とかのテクニックは使いません。bignumも最初はなしで必要になったらGNU MP libraryを使います 。ガベージコレクタは最初はつけずに開発します。いずれ必要になればBoehm-Demers-Weiser garbage collectorを使用することにします。

現在のCで書いた縮小機能版は、バッククオートなどもサポートしたread関数、適当に書いたformat-object関数、eval関数などです。つまりrepループは動いています。
ストリームもC言語ライブラリのストリームへの薄いラッパーとして実装しました(stream-ready-pが実装できない危険性あり)。コントロール系スペシャルオペレータのif、Non local exitのunwind-protect、catch、 throw、 tagbody、 go、 block、 return-fromなどもCで記述しました。簡単なerror関数。あとISLispで書いたファイルをロードしてISLisp処理系として立ち上げるためのload関数など。

ISLispで書いたファイルはbuilt_in_classes.lisp、class.lisp、cons.lisp、control.lisp、error.lisp、
format_object.lisp、generic_function.lisp。

class.lispはdefclassを定義しています。このdefclassはメタクラス指定が<built-in-class>のクラス定義だけ動くようになっています。まだメタクラスが<standard-class>のものは受け付けません。

built_in_classes.lispは<built-in-class>をメタクラスにもつ<cons>, <vector>などのクラスの継承関係をdefclass文を使って記述しています。

generic_function.lispは現在書きかけです。Generic Functionは以前、Cで実装したことがあるので実装する自信はありますがなぜかここでやる気が途切れて放置しています。

generic functionは<standard-class>のクラスが定義できないdefclassのままでもテストできるので、次の実装目標となりました。(<sequece>, <string>, <cons>などのビルトインクラスのオブジェクトをテストには使います。)

Standard Class、Generic FunctionとCondition Systemが書けたらもうあとは考える必要がないような部分になります。果たしてこの山を越えられるのかまた挫折するのか。Condition Systemは一回、Common Lispで書いたことがあるのでできるはずなんですが忘れています。クロージャとダイナミック変数を使って実装したような…。