elisp 準備

(define-module "foo") ;; error
(define-module (string->symbol "foo")) ;; error
(define-module (find-module 'user)) ;; error
(define-module |hello world|) ;; ok
(select-module user) ;; ok
(select-module (find-module 'user)) ;; error
(read-from-string "(define-module bla)") ;; => (define-module bla)
(find-module 'bla) ;; => #f
(if #t
  (define-module foo)
  (define-module bar))
;; => module foo, module bar とも定義される。
(if #t
  (select-module user)
  (select-module no-such-module)) ;; error

どうやら module 関連は read された瞬間に評価される特別なものらしい。module 関連はコンパイル時に評価される。実用上はファイル先頭から (select-module symbol) を探して symbol を読めばファイルから module をだいたい決定できるだろう。必要なら手動で定義する手段を作れば十分。

R6RS だとそもそも library で全体を囲うようなので、library の一部だけ再定義、とかきっと無いのだろう。あ、そもそも REPL すら仕様範囲外なんだっけ。うーん。エレガントなような、 lisp じゃないような複雑な気分。