Kouhei Sutou
kou****@cozmi*****
2008年 10月 20日 (月) 21:54:45 JST
須藤です。 In <20081****@lava*****> "Re: [Gauche-devel-jp] autoloadとglobal-variable-refのdefault" on Sat, 18 Oct 2008 23:31:35 -1000 (HST), Shiro Kawai <shiro****@lava*****> wrote: > むー、このケースは考えてなかったです。 > dangling autoloadというのは幽霊みたいなもので、バインディングが > 存在するとも存在しないとも言えない微妙な状態なんですね。 > システム的にはバインディングは存在するんだけれど、その実体はダミーで、 > 触ろうとした途端下のレイヤでautoloadがかかると。 > > 理念的には、完全に解決できなかった場合にはunboundだったことにする、 > とした方がいいかなあ。そんな気がしますね。 私もそう思います。 とりあえず、そのような動作になるまで、gauche.testの test-moduleでのglobal-variable-refではエラーを捕まえるという のはどうでしょうか? Index: lib/gauche/test.scm =================================================================== --- lib/gauche/test.scm (revision 6418) +++ lib/gauche/test.scm (working copy) @@ -279,7 +279,8 @@ (define (toplevel-closures module) (%filter closure? (map (lambda (sym) - (global-variable-ref module sym #f)) + (guard (_ (else #f)) + (global-variable-ref module sym #f))) (hash-table-keys (module-table module))))) (define (closure-grefs closure) 例えばこんなテストを実行したとすると (use gauche.test) (let ((module (make-module #f))) (eval '(autoload "nonexistence" XXX) module) (test-module module)) こんな結果になります。 testing bindings in #<module #> ... gosh: "error": cannot find file "nonexistence.scm" in *load-path* ("/tmp/local/share/gauche/site/lib" "/tmp/local/share/gauche/0.8.14/lib") それよりもこのような結果になった方が問題を見つけやすいのでは ないでしょうか。 testing bindings in #<module #> ... ERROR: found dangling autoloads: (XXX) # test-moduleのコードも後者を意図しているようにみえる。