在SML / NJ编译管理器

时间:2016-01-11 13:49:39

标签: sml smlnj cm

我正在使用SML / NJ 110.79,其中包括对Successor ML项目定义的新结构的支持。其中,Fn结构。

碰巧,我已经在my personal project with utilities之一中使用了同名的结构,在110.79之前工作正常。

使用110.79,对于 .cm 文件:

group is
  $/basis.cm
  $SMACKAGE/sml-extras/v0.1.0/sources.sml.cm

但我收到以下错误:

  

sources.cm:3.3-3.45错误:从中导入的结构Fn   $ SMLNJ-BASIS /(basis.cm):basis-common.cm@155252(fn.sml),也来自   $ SMACKAGE / SML-额外/ v0.1.0 /(sources.sml.cm):SRC / fn.sml

有没有人知道如何通过编译管理器解决此冲突。理想情况下,我的Fn结构将能够扩展"仅Fn标准open,但使用sml-extras库的项目不会看到标准的Fn结构,只会看到我的扩展版本。

这可能吗?我是否需要在sml-extras.cm项目中包装/重新导出整个basis.cm库?

1 个答案:

答案 0 :(得分:5)

我设法通过在CM manual,§2.9中使用我认为所谓的管理库来解决这个问题。

这恰恰意味着创建一个辅助 .cm 文件,该文件包装基础库并仅重新导出我们感兴趣的符号。

sources.cm

这是主项目文件。

library
  structure Main
is
  (* Let's say this library redefines the Fn and Ref structures    *)
  (* and the REF signature.                                        *)
  $SMACKAGE/sml-extras/v0.1.0/sources.sml.cm

  (* This excludes out Fn, Ref and REF from the Basis library, but *)
  (* imports anything else.                                        *)
  amended-basis.cm

  main.sml

amended-basis.cm

此文件导入$/basis.cm,然后重新导出除FnRefREF之外的所有内容。

group
  library($/basis.cm) - (
    structure Fn
    structure Ref
    signature REF
  )
is
  $/basis.cm

main.sml

structure Main =
  struct
    open Fn (* sml-extras's Fn *)
  end

该解决方案基于CM手册第4节中描述的 set calculus 和附录A中的EBNF语法。

另一种解决方案是改变sml-extras以重新导出整个$/basis.cm,同时遮蔽冲突的符号。但是,出于模块化的考虑,我决定采用上面详述的解决方案。