首页 文章

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

提问于
浏览
2

我想使用函数 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 ,因为它似乎失败了来自 identifier-binding 函数的 module-path-index . 例如,以下代码:

#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 回答

  • 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))
    

相关问题