Разрешить конфликт библиотек в 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, затеняя конфликтующие символы. Однако в интересах модульности я решил пойти с решением, подробно описанным выше.

Другие вопросы по тегам