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)))

うごきました。

9.整理しよう

やり残したこと

  • condition? の実装。
    • &condition のサブタイプかどうかの判断をどうしようか?(psyntax の世界とのやりとり)
  • condition-rcd, condition-rtd の export
  • バックエンドのcondition 系の手続きのテスト
  • R6RS 的テストを追加しまくる
  • 翻訳R6RS の誤訳を直す
  • 例の場所にコメントで報告。