我正在使用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库?
答案 0 :(得分:5)
我设法通过在CM manual,§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节中描述的 set calculus 和附录A中的EBNF语法。
另一种解决方案是改变sml-extras以重新导出整个$/basis.cm
,同时遮蔽冲突的符号。但是,出于模块化的考虑,我决定采用上面详述的解决方案。