R6RS Conditon をサポートする
手順
1.R6RS Condition objects にある手続きを空で実装する。
空で実装するのは楽だね。楽だね。
2.mosh/conditon.ss を作る。
(define-record-type &condition (nongenerative)) (define &condition-rtd (record-type-descriptor &condition)) (define &condition-rcd (record-constructor-descriptor &condition))
のように Record を利用して Condition を定義していく。
3.動作確認用のスクリプトを用意
(import (rnrs)) (display &message)
4. buildscript に condition.ssを追加してみる
psyntax-buildscript-mosh.ss に condition.ss を追加する。
(define scheme-library-files '("psyntax/compat.ss" "psyntax/internal.ss" "psyntax/config.ss" "psyntax/library-manager.ss" "psyntax/builders.ss" "psyntax/expander-mosh.ss" "../../r6rs-examples/mosh/condition.ss" ; 追加 "psyntax/main-mosh.ss"))
これで psyntax を expand すると怒られる。
gosh: "error": #f "invalid binding for implementation-restriction"
とか言われた。あぁ。そうか。 implementation-restriction は R6RS の conditions じゃなかった。
これをコメントアウトした。
psyntax が展開されるようになりました。
5.テストスクリプトを実行
% ../mosh -b condition-test.ss opaque #f opaque #f conditionPredicateEx ConditionProcedures.cpp:43 conditionAccessorEx ConditionProcedures.cpp:38 opaque #f conditionPredicateEx ConditionProcedures.cpp:43 opaque #f
空で作っておいた手続きたちが呼ばれている。そろそろ実装するか。
6.仕様の把握
細かい仕様の把握。
Simple Condition は Record で、CompoundCondition は primitive に用意されていると。
condition-accessor の仕様が全く理解できないと思ったら、誤訳っぽいぞ。
7.実装
Record が SimpleCondition なのか、それともただの Record なのかを知るには &condition のサブタイプであるかどうか?を調べる必要がある。
&condition の存在を backend が知らないといけないのだな。どういう設計にするか迷うところだ。
→だいたい終わった。
condition? だけは後回し
8.動かしてみる
(import (rnrs)) (let ([c (make-message-condition "hige")]) (display c) (display (message-condition? c)))
うごきました。