Archive for 3月, 2008

続7・PrologでR6RS(終) ~R6RSらしさを求めて~

水曜日, 3月 5th, 2008

PrologでSchemeインタプリタ作り終わったよー。
R6RS(のAppendixA)にほぼ準拠してます。
ソース
(SWI-Prologで動作を確認しています)
どのあたりがR6RSなのかということで、
R6RSっぽいところを集めてみました。

続6・PrologでR6RS ~letrecのターン~

火曜日, 3月 4th, 2008

letrecを作りました。
多分一番長い簡約規則。

evaluate("(letrec ((fact (lambda (n) (if (eqv? n 0) 1 (* n (fact (- n 1))))))) (fact 3))").
6
Yes

これで再帰呼び出しが書けるようになりました。
あとletrec*を作って、例外を発生させる規則を書けば、
Appendix Aの仕様をほぼ満たすことになります。

ゆとりTシャツ完成予想図

続5・PrologでR6RS ~地味な話~

火曜日, 3月 4th, 2008

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の例外が複雑すぎる

土曜日, 3月 1st, 2008

R6RS Standard Librariesを全部読むのはしんどいので、
とりあえず例外のところ(7章)を読もうと思ったら、
説明で新しい型であるレコード型の機能を使いまくっていました。
レコード型といってもただのレコードだろと思ったら、
親レコードの指定とか色々な機能があるみたいです。
子レコードが親レコードの関数を使ったり、もはやオブジェクト指向みたいでした。
といってもまあ、レコードのところ(6章)は読んでないからあまり分からないんですが。
例外処理のための手続き、構文はそれほどありませんが、
レコードが複雑すぎるせいで、例外の機能も複雑になってます。
むしろ、例外を作るためにレコード型を作った気もしました。
あと10年もすれば「Schemeの仕様は小さい」は都市伝説になってしまうのでしょうか……