解决SML/NJ编译管理器中的库冲突

解决SML/NJ编译管理器中的库冲突,sml,smlnj,cm,Sml,Smlnj,Cm,我正在使用SML/NJ 110.79,它包括对后续ML项目定义的新结构的支持。其中包括结构 碰巧的是,我在其中一个中已经有了一个同名的结构,它在110.79之前运行良好 对于110.79,对于此.cm文件: 但是,我得到了以下错误: 来源.cm:3.3-3.45错误:结构Fn从导入 $SMLNJ-BASIS/(BASIS.cm):普通基础。cm@155252(fn.sml)以及 $SMACKAGE/sml extras/v0.1.0/(sources.sml.cm):src/fn.sml 有人知

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

碰巧的是,我在其中一个中已经有了一个同名的结构,它在110.79之前运行良好

对于110.79,对于此.cm文件:

但是,我得到了以下错误:

来源.cm:3.3-3.45错误:结构Fn从导入 $SMLNJ-BASIS/(BASIS.cm):普通基础。cm@155252(fn.sml)以及 $SMACKAGE/sml extras/v0.1.0/(sources.sml.cm):src/fn.sml

有人知道如何通过编译管理器解决此冲突吗。理想情况下,我的
Fn
结构将能够通过
打开它来“扩展”标准
Fn
,但是使用sml extras库的项目将不会看到标准
Fn
结构,只有我的扩展版本


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

我通过使用我认为在§2.9中称为管理库的方法解决了这个问题

这意味着创建一个辅助的.cm文件来包装basis库,并只重新导出我们感兴趣的符号

资料来源.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
修正-basis.cm 此文件导入
$/basis.cm
,然后重新导出除
Fn
Ref
Ref
之外的所有文件

group
  library($/basis.cm) - (
    structure Fn
    structure Ref
    signature REF
  )
is
  $/basis.cm
main.sml 该解决方案基于CM手册§4中描述的集合演算和附录A中的EBNF语法


另一个解决方案是将sml extras更改为重新导出整个
$/basis.cm
,同时隐藏冲突符号。然而,为了模块化的利益,我决定采用上面详述的解决方案。

有趣的问题。最简单的解决方法是更改
Fn
版本的名称(例如,更改为
Fnct
)。编译管理器确实具有条件编译功能。此外--新版本的发行说明提供了一些建议,说明如何处理新功能破坏旧代码的情况。@JohnColeman重命名结构是我的最后一个选项:)暂时,我改为使用$/basis-2004.cm,而不是新的,只是为了让代码能够编译。
group
  library($/basis.cm) - (
    structure Fn
    structure Ref
    signature REF
  )
is
  $/basis.cm
structure Main =
  struct
    open Fn (* sml-extras's Fn *)
  end