【发布时间】:2016-09-08 01:43:39
【问题描述】:
有没有办法从 SML/NJ REPL 获取顶级环境中可用的 signatures 或 structures 列表?我正在寻找似乎在 sml 源目录中的 sources.cm 文件中定义的签名/结构的列表。类似于
- signature s = LIST;
只列出顶级环境中的绑定。
【问题讨论】:
有没有办法从 SML/NJ REPL 获取顶级环境中可用的 signatures 或 structures 列表?我正在寻找似乎在 sml 源目录中的 sources.cm 文件中定义的签名/结构的列表。类似于
- signature s = LIST;
只列出顶级环境中的绑定。
【问题讨论】:
您可以使用 SML/NJ 提供的internal structures:
fun boundSignatures () =
let
fun isSignature symbol = Symbol.nameSpace symbol = Symbol.SIGspace
val signatures = List.filter isSignature (EnvRef.listBoundSymbols ())
in
List.app (fn s => print (Symbol.name s ^ "\n")) signatures
end
请注意,由于自动加载,EnvRef.listBoundSymbols 不会返回可用但尚未加载的模块的符号名称:
- boundSignatures ();
ENVREF
val it = () : unit
- signature S = STATICENV;
[autoloading]
[autoloading done]
- boundSignatures ();
STATICENV
ENVREF
S
val it = () : unit
【讨论】:
CM.make("$/basis.cm") 来强制添加基础值。
CM.make "$/basis.cm"。在 SML 中,仅当您需要明确指定关联性时才需要括号。它们不用作函数调用的语法。空格用于指定函数调用。