Gauche:ImportModifier
Shiro(2009/09/26 19:27:16 PDT): モジュールのインポート時にprefixをつけたい、 という要望はずいぶん前からあって、r6rsコンパチモードでも そういう機能は必要になるんで、いよいよ実装することにする。
仕様
importとuseを拡張。
- import <module-spec> ...
- use <module-name> [ . <modifier-kv-list> ]
<module-spec> : <module-name> | (<module-name> . <modifier-kv-list>) <module-name> : <symbol>
<modifier-kv-list>はキーワードと値の交代リストでimport modifierを 指定する。次のmodifierがサポートされる。
- :only (<identifier> ...)
インポートしたモジュールから<identifier>...のみが見えるようにする。
- :except (<identifier> ...)
インポートしたモジュールのうち、<identifier>...以外を見えるようにする。
- :rename ((<identifier-orig> <identifier-new>) ...)
インポートしたモジュール中の<identifier-orig>の束縛を、<identifier-new>の 束縛として見えるようにする。もともとの<identifier-orig>の束縛は見えなくなる。
- :prefix <identifier>
インポートした側では、<identifier>をプリペンドした名前が見える。
(use srfi-1 :prefix srfi-1:) srfi-1:filter => srfi-1 の filterを参照
実装
prefixについては識別子を探す側、つまりScm_FindBindingで対応する。 prefixつきでimportされているモジュールを探しに行くときは、 探すべき識別子からprefixを取り除いてやるだけだ。
only, except, renameについては、import時にダミーのモジュールを作る。
- onlyが指定されていたら、無名モジュールを作り、その中に 指定された識別子だけの束縛を作成する。
- exceptが指定されていたら、無名モジュールを作り、元のモジュールを 継承させた上で、取り除く識別子の分だけ "negative binding" (親モジュールの 束縛を見えなくする仕掛け) を挿入しておく。
- renameが指定されていたら、元モジュールを継承した無名モジュールを 作り、<identifier-old>の束縛をやはりnegative binding で消したうえで、 <identifier-new>の束縛を挿入する。