【问题标题】:Query the SML/NJ REPL for signatures or structures?查询 SML/NJ REPL 的签名或结构?
【发布时间】:2016-09-08 01:43:39
【问题描述】:

有没有办法从 SML/NJ REPL 获取顶级环境中可用的 signatures 或 structures 列表?我正在寻找似乎在 sml 源目录中的 sources.cm 文件中定义的签名/结构的列表。类似于

- signature s = LIST;

只列出顶级环境中的绑定。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    您可以使用 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") 来强制添加基础值。
    • @jenesaisquoi 谢谢,我不知道。顺便说一句,括号在那个调用中是多余的:CM.make "$/basis.cm"。在 SML 中,仅当您需要明确指定关联性时才需要括号。它们不用作函数调用的语法。空格用于指定函数调用。
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2011-11-24
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多