2016-01-26 2 views
1

У меня есть спецификация, и я хочу преобразовать ее в библиотеку. Я могу написать программу, которая выписывает источник Haskel. Однако есть ли более чистый способ, который позволил бы мне напрямую скомпилировать спецификацию (возможно, используя шаблоны)?Создание библиотек из машиночитаемых спецификаций в Haskell

Ссылки на руководства и учебные пособия были бы очень полезными.

+0

«Я могу написать программу, которая выдает источник Haskel». Если эта программа написана в Haskell, неизменно источник Haskell будет представлен некоторым AST в какой-то момент - преобразуйте это ast в TH ast и что AST может быть вставлен непосредственно в качестве кода TH. Вы не можете объединить модуль, его импорт и экспорт, поэтому у этого есть свои ограничения. Наконец, «ссылки на учебные пособия и руководства» не соответствуют теме SO. – user2407038

+0

https://hackage.haskell.org/package/haskell-generate –

+0

Есть ли какая-нибудь причина превратить его в библиотеку, а не просто написать интерпретатор? – PyRulez

ответ

1

Да, вы можете использовать Template Haskell. Это несколько подходов к его использованию.

Один из подходов состоит в том, чтобы использовать quasiquotation для вставки (частей) текста спецификации в квазивокацию в исходном файле. Чтобы реализовать его, вам нужно написать парсер спецификации машины, который выводит Haskell AST. Это может быть полезно, если спецификация относительно статична, имеет смысл иметь подмножества спецификации или вы хотите вручную сопоставить части спецификации с различными модулями. Это также может быть полезно, в дополнение к другому подходу, возможно, предоставить инструменты для пользователей библиотеки, чтобы выразить вещи в терминах спецификации.

Другой подход заключается в execute IO в обычном сращивании шаблона Haskell. Это позволит вам прочитать спецификацию из файла (в этом случае также см. addDependentFile), сеть (не делайте этого) или выполнить произвольную программу для создания Haskell AST. Это может быть более полезным, если спецификация изменяется чаще, или вы хотите сохранить строгое разделение между спецификацией и кодом.

Если намного проще произвести источник Haskell, чем Haskell AST, вы можете использовать библиотеку, такую ​​как haskell-src-meta, которая будет анализировать строку в шаблоне Haskell AST.

Смежные вопросы