Let's start Scheme

2010-12-14

R6RSのライブラリ その2

前回の投稿にコメントをいただいて、ちょっと舞い上がっていたり。
(と同時に、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