Pascal/Ruby/Java/Python/C# によるモダンな Lisp の小さな実装

2007.4.28 - 2012.3.28 (鈴)
第1回 L2 Lisp: 標準 Pascal によるモダンな Lisp の小さな実装 (1.1 版/Pascal) 2007.4.28 - 2007.5.18
静的スコープ, 末尾呼出しの最適化,マクロを備えた近代的な Lisp を,ISO 7185/JIS X 3008 の標準 Pascal で作成します。 プロトタイプ的な実装ですが,ガーベジコレクションも備えた,まとまったインタープリタです。

第2回 続 L2 Lisp: 従来の約3倍の速さの実現 (2.0 版/Pascal) 2007.6.1
ラムダ式の内部表現とマクロ展開の方法を改良してインタープリタを高速化します。 場合により約3倍の高速性能が得られます。 また,マクロの「変数捕捉」問題を解決するため未インターン・シンボルを導入します。

第3回 続々 L2 Lisp: マクロの健全化 (3.0 版/Pascal) 2007.6.11 - 2007.7.4
マクロの「変数捕捉」問題をより簡単に解決するため, 未インターン・シンボルのかわりにダミーシンボルを導入します。

第4回 L2Lisp.rb: Ruby への移植 (4.1 版/Ruby) 2007.7.7
Ruby 1.8.[2-6] および JRuby 1.0 に Lisp インタープリタを移植します。 Cons セルの実現方法として,Pascal 直訳ではなく Ruby ならではのクラスを実験結果から選びます。 800 行あまりのスクリプトになります。 名前空間をきれいに分離させており,干渉することなく他の Ruby プログラムにライブラリとして組み込み可能です。 Pascal 実装に比べれば約 100 倍低速ですが, Ruby 上の Lisp インタープリタとしては高速です。

第5回 Let Little Lambda Lisp be a Little Lazy (4.3 版/Ruby) 2007.7.14 - 2007.7.20
Scheme ライクな遅延評価機能を導入します。 従来,ほとんどすべての Scheme 実装の遅延評価機能は, 原始的な道具立てから遅延評価バージョンの関数群を一式そろえる必要があったため, せいぜい学習用の実験教材に使われてきただけでした。 ここでは,誰でも手軽に実用的に遅延評価機能を利用できるようにするために, 今まで実装例がほとんど知られていない implicit forcing を実現します。 その性能上のペナルティも実測し,意外にも十分許容範囲にあることを確かめます。

第6回 L2Lisp.jar: Java への移植 (5.0 版/Java) 2007.9.14 - 2007.9.20
implicit forcing を備えた Lisp インタープリタをおおむね Ruby からの直訳で Java 1.5.0 に移植します。 シンボル,イテレータ,無限多倍長整数が移植のかなめです。 Ruby 実装に比べ,場合により約 100 倍の速度が得られます。 Java 上の Lisp インタープリタとしても高速です。

第7回 より実用的な L2Lisp.rb (6.0 版/Ruby) 2008.4.4
第5回の L2 Lisp 4.3 版/Ruby をより実用的にします。 無くても何とかなるものとして今まで後回しにされてきた準引用や各種の関数を整備し, 未定義シンボルの取り扱いなどをより標準的な仕様にします。 その簡単なベンチマークテストは Ruby 1.9.0-1 の意外な性能を明らかにします。
付録: 簡単な遅延評価のプログラム例 2008.4.4 - 2008.4.10

第8回 Little Lazy Lisp 6.1 in Ruby (6.1 版/Ruby) 2008.4.18
主に遅延評価プログラミングの便宜のための小改訂です。 遅延リスト生成関数のまとめとして読むこともできます。

第9回 L2 Lisp の Python 2.5 & 3.0 への移植 (7.0 版/Ruby, 7.1 版/Python) 2008.5.23 - 2008.6.3
L2 Lisp の Ruby による実装を整理するとともに,Python に移植します。 Python 2.5 と Python 3.0 の両方で動くようにしてみます。 Lisp インタープリタを題材としたときの,Python と Ruby の二つのスクリプト言語の意外な差 (あるいは差の無さ) が示されます。
付録: Psyco コンパイラによる L2Lisp.py の高速化 2008.6.3

第10回 現行の各種 Python への L2 Lisp の移植 (7.2 版/Python) 2008.6.10
主に使いやすさの向上とターゲットの拡大のための小改訂です。 IronPython と Jython を含む現在の妥当な Python 処理系のほとんどで L2 Lisp が動くようにします。 また,第1回以来ずっと見過ごされていた equal 関数の誤りを訂正します。

第11回 L2 Lisp 7.3 と Ruby 1.9.0 の再評価 (7.3 版/Ruby) 2008.7.4
第10回の Python 用の改訂に準じた,主に使いやすさの向上のための Ruby 用の小改訂です。 また,第7回で見た Ruby 1.9.0-1 の意外な性能の,さらに意外な (Ruby の明るい未来を暗示する) 実情を明らかにします。

第12回 C# による L2 Lisp の実装 (8.0, 8.1, 8.2 版/C#) 2008.7.18 - 2008.8.28
第10回,第11回の仕様に準じた L2 Lisp を C# で実装します。 Mono と .NET Framework の両方で動きます。 yield return やカスタム属性など,C# の学習者にとって興味深い技術のデモンストレーションとして見ることもできます。

第13回 Java による新しい L2 Lisp の実装 (9.0, 9.1, 9.2 版/Java) 2010.7.29 - 2010.8.19
第10回,第11回の仕様に準じた L2 Lisp を Java で実装します。 前回,ほのめかした末尾再帰の最適化の実装簡素化の解答編ともいえる内容です。 また,ベクトル (vector) を Emacs Lisp に準じた仕様で追加します。

第14回 Java による半分の Arc の実装 (10.0 版/Java) 2010.9.13
第13回の Java による L2 Lisp の実装を少し改造して Arc 言語を実装します。

第15回 Java による半分の Arc の改訂実装 (10.1, 10.2 版/Java) 2010.10.1, 2011.10.20
第14回の Java による Arc 言語の実装を改訂して,有理数をサポートするなど,完成度を高めます。

第16回 Semi-Arc の Android への移植 (10.2 版/Java) 2011.12.12, 2012.1.10
第15回の Arc 言語の実装を Android で動作させてみます。 インタープリタ本体をそっくりそのまま使い,Android 上に端末入出力を模倣する簡単なユーザ・インタフェースを構築してこれを実現します。
付録: Android 開発手順 2011.12.12, 2012.1.10

第17回 Android 上のユーザ・インタフェースの実現 (10.2 版/Java) 2012.2.28
第16回の拡大改良版として Android 上で Lisp (Arc) プログラミングが完結してできる程度のユーザ・インタフェースを実現します。 二つのアクティビティとして,ロードすべきファイルを SD カードから見つけるファインダと,それを編集するエディタを追加します。 Lisp 式の入力に役立つ括弧の対応表示機能を EditText 上に実装してみます。
付録: GNU Prolog for Java の Android への移植 2012.3.28


Copyright (c) 2007 - 2012 OKI Software Co., Ltd.