続7・PrologでR6RS(終) ~R6RSらしさを求めて~
水曜日, 3月 5th, 2008PrologでSchemeインタプリタ作り終わったよー。
R6RS(のAppendixA)にほぼ準拠してます。
ソース
(SWI-Prologで動作を確認しています)
どのあたりがR6RSなのかということで、
R6RSっぽいところを集めてみました。
PrologでSchemeインタプリタ作り終わったよー。
R6RS(のAppendixA)にほぼ準拠してます。
ソース
(SWI-Prologで動作を確認しています)
どのあたりがR6RSなのかということで、
R6RSっぽいところを集めてみました。
letrecを作りました。
多分一番長い簡約規則。
evaluate("(letrec ((fact (lambda (n) (if (eqv? n 0) 1 (* n (fact (- n 1))))))) (fact 3))"). 6 Yes
これで再帰呼び出しが書けるようになりました。
あとletrec*を作って、例外を発生させる規則を書けば、
Appendix Aの仕様をほぼ満たすことになります。
—
ゆとりTシャツ完成予想図
Prologで作るSchemeインタプリタですが、
R6RSの形式的意味論の仕様を大体満たすようになってきました。
ただし、入力によっては死ぬほど遅いです(dynamic-windが関わると遅い?)。
とりあえず、最近触ったのは、例外処理、算術演算、リスト操作、
eqv?, apply, call-with-valuesあたりです。どれも地味で悲しくなります。
一番華やかなのは入出力をS式でできるようにしたこと。
evaluate("(car '(a b c))"). a Yes evaluate("(cdr '(a b c))"). (b c) Yes
こうすると、かなりSchemeインタプリタっぽいですね。
R6RS Standard Librariesを全部読むのはしんどいので、
とりあえず例外のところ(7章)を読もうと思ったら、
説明で新しい型であるレコード型の機能を使いまくっていました。
レコード型といってもただのレコードだろと思ったら、
親レコードの指定とか色々な機能があるみたいです。
子レコードが親レコードの関数を使ったり、もはやオブジェクト指向みたいでした。
といってもまあ、レコードのところ(6章)は読んでないからあまり分からないんですが。
例外処理のための手続き、構文はそれほどありませんが、
レコードが複雑すぎるせいで、例外の機能も複雑になってます。
むしろ、例外を作るためにレコード型を作った気もしました。
あと10年もすれば「Schemeの仕様は小さい」は都市伝説になってしまうのでしょうか……