Структурирование библиотеки в SML

В настоящее время я создаю тестовую библиотеку в Standard ML (используя Poly/ML в качестве интерпретатора). У меня есть следующая структура каталогов:

project/a.sml
project/src/b.sml
project/src/c.sml
...

Где a.sml — это просто набор вызовов для использования

use "src/b.sml"
use "src/c.sml"
...

b.sml, c.sml и т. д. - все определения структуры, подобные этому

structure ComponentX
struct
...
end

которые образуют красивые, логически разделенные компоненты библиотеки. Иногда я также создаю один модуль в одном файле, а затем добавляю подструктуру в тот же модуль в другом файле.

Затем я могу использовать тестовую библиотеку в корневом каталоге проекта, вызвав use "a.sml".

Однако я не могу использовать код вне его собственного каталога, что немного проблематично. Например, предположим, что я в родительском каталоге project. Если я затем вызову use "project/a.sml", последующие вызовы use "src/x.sml" попытаются найти каталог src в родительском каталоге (которого не существует).

Есть ли способ сделать относительный use, или есть лучший способ структурировать это в целом?


person Alex Coplan    schedule 21.05.2015    source источник


Ответы (1)


Сама функция use в Poly/ML не меняет путь при рекурсивном использовании. Вам нужно будет явно изменить путь внутри подкаталога, используя OS.FileSys.chDir. use — это просто функция, поэтому вы можете переопределить ее, если хотите. Структуры OS.Path и OS.FileSys могут быть полезны.

Альтернативой является реорганизация вашего кода для использования PolyML.make. Вам нужно будет переименовать свои файлы, чтобы они соответствовали имени структуры, которую содержит каждый файл, например. ComponentX.sml будет содержать структуру ComponentX. Подробнее об этом см. polyml.org/documentation/Reference/PolyMLMake.html или этот ответ о Poly /ML с вложенными структурами каталогов.

person David Matthews    schedule 24.05.2015