什么是 Racket 中的模块路径索引

What is a Module Path Index in Racket

球拍有Module Paths (predicate is module-path?), Resolved Module Paths (predicate is resolved-module-path?), and Module Path Indexes(谓词是module-path-index?)。

我猜 module-path? 是任何可能指向模块的东西。我想解析的模块路径指向系统上的实际模块。

但是什么是模块路径索引,它让我通过解析的模块路径得到了什么?

A module-path? 包含可以 required 的任何内容。可以是 path?,可以是符号,可以是子模块路径 (submod "food.rkt" lunch)。请参阅文档中的 require

A resolved-module-path? 是 "absolute path" 到 Racket 可以找到模块的地方(注 1)。已解析模块路径的语法比模块路径更受限制(即更明确)。

A module-path-index? (MPI) 是从一个 module-path-index? 到另一个的增量 (注 2) .使用 module-path-index-join 构建 MPI(注 3)。

  • (module-path-index-join #f #f) 是当前模块与其自身的增量。
  • (module-path-index-join "dumplings.rkt" #f) 是从 #f (当前模块)到相对路径 "./dumplings.rkt" 的增量(是的,它确实是 path 首先,然后 base.)
  • (module-path-index-join "nom-noms.rkt" (module-path-index-join "dumplings.rkt" #f)) 是从当前模块到 "./dumplings.rkt""./nom-noms.rkt" 的增量。当一个文件静态需要另一个文件时,Racket 会像这样构建 MPI——这些可以链接在一起以找到标识符的绑定。
  • (module-path-index-join '(submod test) #f)指的是当前模块中的测试子模块。

希望对您有所帮助。


注意1:如果模块在文件中,则它的解析路径是绝对文件路径。如果模块是在语法对象上调用 eval 的结果,则它的 resolved-module-path? 是其他东西。

注 2:IMO "module path deltas" 会是一个更好的名称。

注意 3:当前两个参数为 #f 时,module-path-index-join 接受第三个可选参数。这让一个模块引用它自己的子模块之一。您通常不想直接使用此功能。而是使用 quote-module-path.