我想使用函数module->exports
来查找模块提供的所有导出。不幸的是,传递给该函数的模块必须在当前命名空间中声明,然后才能在其上使用该函数。当我知道模块是静态的时候这没问题,我只需要它进入当前模块然后使用该功能。
但是,如果我不是静态地知道模块,并且传递了模块路径索引(我知道它指向文件系统中的有效模块),我似乎无法获得模块声明到当前名称空间。如果我想创建module-path-index-> exports函数:
(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"))))
有关如何申报模块的任何建议吗?
更新
我不能在这里使用namespace-reaquire
,因为来自module-path-index
函数的identifier-binding
似乎失败了。例如,以下代码:
#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">
答案 0 :(得分:2)
关闭!但是您需要解析模块路径索引(first binding)
。执行此操作的函数是来自resolve-module-path-index的syntax/modresolve。
#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))