Использование Poly/ML для создания проектов с вложенными структурами каталогов
До сих пор я использовал Poly/ML для нескольких небольших проектов, в которых все файлы исходного кода находятся в одном каталоге. Чтобы построить эти проекты, мне нужно было всего лишь выполнить следующую команду в REPL:
> PolyML.make "Main";
Но теперь у меня есть проект, масштаб которого делает нецелесообразным размещение всех файлов исходного кода в одном каталоге. Чтобы построить эти проекты в REPL, мне нужно выполнить следующие команды:
> PolyML.make "foo/Foo";
> PolyML.make "bar/Bar";
> PolyML.make "qux/Qux";
> PolyML.make "Main";
что не очень практично, так как число подсистем растет.
Есть ли способ автоматизировать процесс создания проектов с вложенными структурами каталогов в Poly/ML?
П.Д.: Я посмотрел и на Менеджер компиляций SML/NJ, и на систему ML Basis ML. Хотя они, несомненно, мощные, они слишком сложны для моих нужд.
2 ответа
Поместите файл с именем ml_bind.ML в каждый из подкаталогов и попросите эти файлы создать компонент для этого каталога.
PolyML.make ожидает, что имя исходного файла будет совпадать с именем компонента (структура, подпись или функтор). Поэтому, если он ищет структуру с именем "Foo", он будет ожидать источник "Foo" в файле с именем "Foo", "Foo.ML" или "Foo.sml". Если вместо этого он находит каталог с именем "Foo", он рекурсивно входит в каталог "Foo" и использует файл "ml_bind.ML" в качестве руководства для построения структуры "Foo". Как правило, "Foo/ml_bind.ML" будет выглядеть
structure Foo = FooFunctor(structure A = FooA and B = FooB);
с файлами "Foo/FooFunctor.ML", "Foo/FooA.ML" и "Foo/FooB.ML", содержащими источник для "FooFunctor", "FooA" и "FooB" соответственно.
Вы можете найти примеры этого в коде для компилятора Poly/ML, который входит в состав дистрибутива исходного кода Poly/ML.
Вы могли бы иметь build.sml
список файлов и use
-все все файлы проекта:
use "bar/bar.sml";
use "foo/foo.sml";
use "main.sml";
Или, немного более кратким:
app use [
"foo/foo.sml",
"bar/bar.sml",
"main.sml"
]
куда app
это стандарт List.app
,
Тогда вы можете создать только этот файл:
$ polyc -o main main.sml
$ # or
$ poly
> PolyML.make "build.sml"