モジュール関連
gosh> (current-module) #<module user> gosh> (module-precedence-list (current-module)) (#<module user> #<module gauche.gf> #<module gauche> #<module scheme> #<module null>)
Builtin Module: null
http://practical-scheme.net/gauche/man/gauche-refj_32.html
このモジュールはR5RSで述べられている"null environment"に相当します。 R5RSの構文要素への束縛だけを含んだモジュールです。
Builtin Module: scheme
このモジュールはnullモジュール内の束縛全てに加えて、 R5RSで定義されている全ての手続きの束縛を含みます。
Builtin Module: gauche
このモジュールはschemeモジュール内の全ての束縛に加え、 Gaucheの組込み手続きや構文が含まれています。
Builtin Module: user
このモジュールはユーザコードがコンパイルされる既定のモジュールです。 gaucheモジュール内の全ての束縛がインポートされています。
現時点では以下の対応関係になっている。
(find-module 'null) == (null-environment 5)
(find-module 'scheme) == (scheme-report-environment 5)
(find-module 'user) == (interaction-environment)
(null-environment 5)は、R5RSで規定されている単なる構文的な 束縛を含むnullモジュールを返します。
http://practical-scheme.net/gauche/man/gauche-refj_56.html
(scheme-report-environment 5)は、R5RSで規定されている 構文的な束縛と手続きの束縛を含むschemeモジュールを返します。
(interaction-environment)は、全てのGaucheのビルトインと ユーザ定義の全てを含んだuserモジュールを返します。
それぞれの中身
R5RSも小さい仕様とはいえ200以上の定義が入っている。
gosh> (define ls (compose hash-table-keys module-table find-module)) ls gosh> (ls 'null) (unquote if let* let-syntax or delay quasiquote define let lambda define-syntax begin and case do quote unquote-splicing set! letrec letrec-syntax cond) gosh> (length (ls 'scheme)) 219 gosh> (length (ls 'gauche)) 892 gosh> (ls 'gauche.gf) () gosh> (ls 'user) (ls *argv* *program-name*)
見慣れないgauche.gfはGenericFunction用。
Gauche:GenericFunctionとModule
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AGenericFunction%E3%81%A8Module
妥協策として、上記の「見えないはずのメソッドが呼ばれてしまう」現象に 目をつむるならば、implicitに作られたgeneric functionは 常に全てのモジュールが継承しているモジュール中に束縛が作られる、 という方法はあります。今のGaucheにある、gauche.gfというモジュールは そのつもりで作ったものです。例えば、 (define-method foo ...)した時点でfooが見えなければ、gauche.gf中に fooという名でgeneric functionを束縛し、それにメソッドを追加します。 gauche.gfは通常のモジュールは全て継承しているので、自動的にfooは 全てのモジュールから見えるようになります
いつも忘れるグローバル変数のリストアップ
(apply append (map (compose hash-table-keys module-table) (all-modules)))
(module-precedence-list (current-module))では一部もれ(継承ではなくimport経由のもの等)があるので(all-modules)を使う点に注意。
なお、(use srfi-1)をすればappend-mapが使える。
(append-map (compose hash-table-keys module-table) (all-modules))