2016-05-19 7 views
2

モジュールによって提供されるすべてのエクスポートを見つけるには、関数module->exportsを使用します。残念ながら、その関数に渡されたモジュールは、現在の名前空間で宣言されてから、その関数を関数に使用できなければなりません。私は、モジュールが静的に何かを知っているとき、これは問題ではありません、私はそれを現在のモジュールに要求してから、その関数を使用します。`module-> exports`で使用するために、現在の名前空間にモジュールを宣言します。

しかし、モジュールが静的にわからず、モジュールパスインデックス(ファイルシステムの有効なモジュールを指しています)に渡されていると、モジュールを現在の名前空間。私はモジュールパス-index->​​輸出機能を作りたい場合は言う:モジュールを宣言する方法について

(define (module-path-index->exports mpi) 
    (parameterize ([current-namespace (make-base-namespace)]) 
    <stuff to load module path index into current-namespace> 
    (if (module-declared? mpi) 
     (module->exports mpi) 
     (error "Module not declared")))) 

任意の提案ですか?

更新:identifier-binding機能から来るmodule-path-index秒で失敗するようだと

私は、ここにnamespace-reaquireを使用することはできません。たとえば、次のコード:

#lang racket 

(define binding (identifier-binding #'contract-continuation-mark-key)) 

(parameterize ([current-namespace (make-base-namespace)]) 
    (dynamic-require (first binding) (void)) 
    (module->exports (first binding))) 

は、このエラーを与える:

Language: racket, with debugging; memory limit: 8192 MB. 
. . require: unknown module 
    module name: #<resolved-module-path:"/Users/leif/racket/racket/collects/racket/contract/private/guts.rkt"> 

答えて

2

閉じます!しかし、モジュールパスインデックス(first binding)を解決する必要があります。これを行う関数は、syntax/modresolveからresolve-module-path-indexです。

#lang racket 

(require syntax/modresolve) 

(define binding (identifier-binding #'contract-continuation-mark-key)) 

(parameterize ([current-namespace (make-base-namespace)]) 
    (define resolved (resolve-module-path-index (first binding) (current-directory))) 
    (dynamic-require resolved (void)) 
    (module->exports resolved)) 
関連する問題