Pascal/Ruby/Java/Python/C# によるモダンな Lisp の小さな実装
2007.4.28 - 2010.7.29 (鈴)
- 第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 版/Java) 2010.7.29
-
第10回,第11回の仕様に準じた L2 Lisp を Java で実装します。
前回,ほのめかした末尾再帰の最適化の実装簡素化の解答編ともいえる内容です。