[Gauche-devel-jp] autoloadとglobal-variable-refのdefault

Back to archive index

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のコードも後者を意図しているようにみえる。




Gauche-devel-jp メーリングリストの案内
Back to archive index