Jailからマクロを使いたい
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版になりました。