解决SML/NJ编译管理器中的库冲突
我正在使用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编译管理器中的库冲突,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 有人知
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