読者です 読者をやめる 読者になる 読者になる

Jailからマクロを使いたい

gauche

soutaroにっきで、定義したjailでロードしたプログラムにおいて、マクロが使いたくなった。具体的には、PLTのdefine-struct。

こいつは、Gauche版がある(http://practical-scheme.net/wiliki/wiliki2.cgi?Gauche%3Adefine-struct)ので、それを使えば良いんだけど、Gaucheのオブジェクトシステムを使っているせいで、R5RSには落ちない。そのため、普通にjailモジュールにdefine-structを輸出するだけでは、使えない。

ここ2年間ほどの課題だったんだけど、ついに思い付いた。evalすれば良いんじゃないか?

(define (eval2)
  (let ((env (interaction-environment)))
    (lambda (expr)
      (eval expr env))))

(define eval3 (eval2))

(define-macro (define-struct1 name fields)
  (eval3 `(define-struct ,name ,fields)))

(define-in-module jail define-struct define-struct1)

一応できたんだけど、ちょっと使いどころが難しいんだよなぁ………

あ、えーとこれだけだと意味不明のコードなんだけど(define-sturctで定義するコンストラクタとかアクセッサとかがjailには定義されない)、実際はうまいことやってます(自動で、コンストラクタとかをjailの中に輸出するようになってる)。


最初は、define-structがやってるプログラムの変換を関数に切り出して、その関数を呼ぶようにしようと考えていたんですが(その方が綺麗だし)、quasi-quotationとか考えているうちに面倒になって、ふとevalすれば良いだけだと気付いたので、eval版になりました。