Разрешить конфликт библиотек в SML/NJ Compilation Manager
Я использую 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 Ошибка: структура Fn импортирована из $SMLNJ-BASIS/(based.cm): Base-common.cm@155252(fn.sml), а также из $SMACKAGE/sml-extras/v0.1.0/(sources.sml.cm): SRC / fn.sml
Кто-нибудь знает, как разрешить этот конфликт через диспетчер компиляции. В идеале мой Fn
структура сможет "расширить" стандарт Fn
просто open
, но проекты, использующие библиотеку sml-extras, не увидят стандарт Fn
структура, только моя расширенная версия.
Это возможно? Нужно ли мне обернуть / реэкспортировать всю библиотеку base.cm в моем проекте sml-extras.cm?
1 ответ
Мне удалось решить эту проблему, используя то, что я считаю административной библиотекой в руководстве по CM, §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
а затем реэкспортирует все это, кроме Fn
, Ref
а также REF
,
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, и на грамматике EBNF из Приложения A.
Другим решением было бы изменить sml-дополнения для реэкспорта всего $/basis.cm
, затеняя конфликтующие символы. Однако в интересах модульности я решил пойти с решением, подробно описанным выше.