在当前命名空间中声明一个模块,用于`module-> exports`

时间:2016-05-19 04:21:04

标签: module namespaces racket

我想使用函数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">

1 个答案:

答案 0 :(得分:2)

关闭!但是您需要解析模块路径索引(first binding)。执行此操作的函数是来自resolve-module-path-indexsyntax/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))