我正在使用SML/NJ 110.79,其中包括对Successor ML项目定义的新结构的支持.其中,Fn
结构.
事实上,我已经在我的个人项目中使用了一个同名的结构,它在110.79之前工作正常.
使用110.79,对于此.cm文件:
group is $/basis.cm $SMACKAGE/sml-extras/v0.1.0/sources.sml.cm
但是我收到以下错误:
sources.cm:3.3-3.45错误:从$ SMLNJ-BASIS /(basis.cm)导入的结构Fn:basis-common.cm@155252(fn.sml)以及$ SMACKAGE/sml-extras/v0.1.0/(sources.sml.cm):SRC/fn.sml
有谁知道如何通过编译管理器解决此冲突.理想情况下,我的Fn
结构就能够"扩展"的标准Fn
由刚open
-ing它,但使用SML-额外库项目,将不会看到标准的Fn
结构,只有我的扩展版本.
这可能吗?我是否需要在sml-extras.cm项目中包装/重新导出整个basis.cm库?
我设法通过使用我认为在CM手册中称为管理库的§2.9 来解决这个问题.
这恰恰意味着创建一个辅助.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
,然后再出口的所有它除了Fn
,Ref
和REF
.
group library($/basis.cm) - ( structure Fn structure Ref signature REF ) is $/basis.cm
structure Main = struct open Fn (* sml-extras's Fn *) end
该解决方案基于CM手册中的集合计算,§4和附录A中的EBNF语法.
另一种解决方案是改变sml-extras以重新导出整个$/basis.cm
,同时遮蔽冲突的符号.但是,出于模块化的考虑,我决定采用上面详述的解决方案.