Gauche > Archives > 2016/01/10

2016/01/10 14:51:51 UTCkaki
#
define-module の中で select-module せずにERマクロを書くとリネームがおかしい気がします。
#
(define-module foo
  (export m n)
  (define x 'foo-x)
  (define-syntax m
    (er-macro-transformer
     (^ (e r c)
       (r 'x)))))

(select-module foo)

(define-syntax n
  (er-macro-transformer
   (^ (e r c)
     (r 'x))))

(select-module user)

(import foo)

(define x 'user-x)
(print (m)) ; user-x
(print (n)) ; foo-x
#
(define-module bar-1
  (export p)
  (define-syntax p
    (er-macro-transformer
     (^ (e r c)
       (print (r 'x))
       #f))))

(define-module bar-2
  (export q)
  (select-module bar-2)
  (define-syntax q
    (er-macro-transformer
     (^ (e r c)
       (print (r 'x))
       #f))))

(select-module user)

(import bar-1)
(import bar-2)

(p) ; #<identifier user#x.1240780>
(q) ; #<identifier bar-2#x.1240620>
2016/01/10 14:59:11 UTCkaki
#
これ書いてて気付いたんですが、define-module の中で select-module しても外側まで影響するのは意外でした。
2016/01/10 21:31:28 UTCshiro
#
これっぽい https://github.com/shirok/Gauche/blob/master/src/compile.scm#L2101
#
プリコンパイルで問題が出たからこうした、と書いてあるが、実行時に名前でモジュールを引いてくれば良さそうな。
2016/01/10 21:52:28 UTCshiro
#
実行時、じゃなくてプリコンパイルされたものがロードされる時、だな。