Использование 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"
Другие вопросы по тегам