(と同時に、Googleか何かの検索エンジンで調べた結果、役立たずなブログにぶつかったぞ、この野郎!と思われてないか不安にもなったり・・・)
自前実装で、簡単なimportとexportを実装したら不思議な現象(いや、原因はわかっているが)に出くわした。
R6RSのライブラリのフェーズの部分というかimport句の部分なの(か?)
前回syntax-caseで書いた部分、
(library (my-lib2)
(export sub)
(import (for (my-lib1) expand)
(rnrs))
(define-syntax sub
(er-macro-transformer
(lambda (form rename compare)
(or (bigger? (cadr form))
`(let ((x ,(caddr form)))
(- x 10)))))))
(library (my-lib3)
(export result)
(import (my-lib2)
(rnrs))
(define (result x)
(sub 10 x)))
(import (my-lib3)
(rnrs))
(display (result 10))
my-lib2は展開するためにbigger?をimportしてる。っで、これが実際に呼ばれる部分はmy-lib3内なので、問題が起きる。
(er-macro-transformerをsyntax-caseの代わりに使ってるからかもしれんが・・・)
書いてる途中で、単に名前解決の仕方がおかしいだけということに気づいた。
考えをまとめるのに、何かに書くというのは有効であるw
my-lib3読み込み → マクロ展開※1 → ライブラリコンパイル
という流れで、※1の展開時にmy-lib2内でexportされてないけど必須になるbigger?の解決を行えばいいのだろう。
一時的にmy-lib3内に取り込んで、展開終了時に開放すればいいか?
まじめにフェーズを実装すればいいんだろうけど、大変そうだしなぁ・・・(よく理解してないし。。。)
No comments:
Post a Comment