(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

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>

*1:でも、ちょっとこの辺まだ未確認というか、ソースコード上でexportされているのは68個(srfi-14だと)なんだけど、これでexportすると66個になる…。