2016-06-17 7 views
1

特定のモジュールの必要なモジュールのリストを保持したいと思います(現在のモジュールを言いましょう)。ラケットのモジュールで必要なモジュールのリストを見つける

私は、モジュールを解析するなどのいくつかのオプションがあるように感じますが、シャドーイング(require)のアイデアを持ち、必要な項目をモジュールのハッシュテーブルに追加し始めました-名。問題は、構文定義を書く方法を理解できないことです。

働いてはいないが、関数定義と等価では以下のようになります:

(define require-list (make-hash)) 
(define require 
    (lambda vals 
    ; add vals to hash-table with key (current-namespace) 
    (let ([cn (current-namespace)]) 
     (hash-set! require-list cn 
       (append vals (hash-ref require-list cn)))) 
    (require vals))) 

...最後の行の呼び出しも同様(必要)の元を呼び出すように変更されなければならないようですか?

正しいバージョンまたはそれを行う方法へのポインタ、または元の目標を達成する他の方法が高く評価されています。

答えて

2

特定のモジュールのインポートリストを取得したい場合は、便利なビルトインmodule->importsがあります。フェーズレベルとモジュールインポートの間のマッピングを返します。フェーズレベルが0より大きい場合は、マクロ展開で使用するためにコンパイル時に使用されるインポートを示します。

> (require racket/async-channel) 
> (module->imports 'racket/async-channel) 
'((0 
    #<module-path-index:(racket/base)> 
    #<module-path-index:(racket/contract/base)> 
    #<module-path-index:(racket/contract/combinator)> 
    #<module-path-index:(racket/generic)>)) 

問題のモジュールがmodule->importsrequireまたはdynamic-requireが両方やるであろう、仕事をするためには、現在の名前空間に含まれていなければならないことに注意してください。

コンパイラが知っている情報を調べるので、特定のモジュールのすべての静的インポートを見つけることができます。ただし、John Clementsが言及した動的要件に関する警告は、実行時に動的に実行できるため、module->importsで検出されません。

+0

これはかなり印象的です、ほとんど私が探しているもの!私の現在の目的では、フェーズ0のマッピングで十分です。また、別のモジュールの関数でこれを呼び出すと、呼び出し元のモジュール名を取得する方法があるのでしょうか?私は現在、参照の名前空間のセクションで失われています。 – MattAPiroglu

2

ショートショートバージョン:

モジュールブラウザを有効にしましたか?

ショートバージョン:

  • あなたは既存のrequireは関数ではありません

完全な解決策になることはないだろう。このため、マクロを必要としていて、

  • しています。それはマクロ形式で実装された言語形式です。これは、コンパイラが同じ情報を収集する必要があるため、コンパイル時に必要なモジュールを知っている必要があるためです。

    これを行う正しい方法は、間違いなく既存の解析を活用することです。モジュールを展開してツリーを歩くと、必要なものはすべて になります。ツリーは非常に大きくなりますが、比較的少数のプリミティブが(多くの場合)含まれるため、このトラバーサルを記述するのは難しくありません。しかし、最初に展開が行われるように名前空間のアンカーなどを設定することには多くの手間がかかります。

    オリジナルのアイデアについて:シャドウに必要なマクロを作成することは間違いありません。別のファイルで定義し、その名前を変更してマクロが元のrequireを参照できるようにする必要があります。また、requireフォームには一連の興味深いサブフォームがあり、これらのサブフォームのすべてを処理しようとするマクロが登場するのは難しいでしょう。しかし、マクロを書くのを見ているなら、すでに80%の解決策について考えているので、おそらくこれはあなたを気にしません。

    最後に、動的モジュール評価を実行するフォームがあります。したがって、これらのフォームに注釈を付けることもできますが、必要なモジュールをすべて確実に知ることはできません(または動的モジュールロード関数)を使用して、これらが発生するのを確認します。

    さらに、Racketメーリングリストでより正確な回答が得られるかもしれません。

  • +0

    ポインタのおかげで、ジョン。私は、マクロで少し慣れたら、シャドーイングマクロを試し、ハッシュテーブルに追加してから、通常の操作に必要なオリジナルを呼び出します。ああ、はい、私もメーリングリストを使ってみるべきです。 – MattAPiroglu

    関連する問題