Gaucheで環境に定義されているシンボルの一覧を取得してみる?
えーと、軽いトラウマになっている環境の話。
というか、ちょっと書いてみたいプログラムがあって、調べて思い通りの結果が取得出来たのでメモメモ。
Gaucheにおける「環境」とはモジュールのことになるらしい。モジュールはトップレベルの名前空間を規定するもの。
現在のモジュール(カレントモジュール)を取得する。
(current-module) ;;#<module user>
こう。だいたい意識しないとuserモジュールにシンボルが定義されていく。
REPLとか、スクリプトとかどっちでも。自分でモジュールを書いているとき以外は問題ないかな。
特定のモジュールで定義されているシンボルの一覧を取得する
(hash-table-keys (module-table (find-module 'user))) ;;(*argv* *program-name*)
こんな感じ?find-moduleでall-modulesの中から対応するモジュールを引っ張ってくる。
つまり、useされているモジュールの中から(最初から読み込まれているものも含む)、対応するモジュールを探してくるわけです。
で、勿論だけど、それまでに定義されたシンボルがあれば、userモジュールはそれを含めて返します。
(define hoge 10) (define fuga 20) (define (f x) (* x x)) (hash-table-keys (module-table (find-module 'user))) ;;(f hoge *argv* fuga *program-name*)
で、モジュールなんかだとexportされている(つまり、表面的に使える手続き)を取得することが出来て、こう書けそう。*1
(module-exports (find-module 'srfi-14))
おまけ
Gaucheにはglocっていうクラスがあるぽい。Global Locationの略かな。
(define hoge 10) (let1 table (module-table (find-module 'user)) (describe (ref table 'hoge))) ;;#<gloc user#hoge> is an instance of class <gloc>