2017-01-03 4 views
1

Скажем, у меня есть String (или Text или что-то еще), содержащий действительный код Haskell. Есть ли способ конвертировать его в [Dec] с шаблоном Haskell?Возможно ли испускать исходный исходный код с шаблоном Haskell?

Я уверен, что AST не отправляется напрямую в GHC, поэтому в любом случае будет печать, а затем и парсинг.

Это было бы здорово, так как это позволило бы использовать разные «бэкэнды» для TH. Например, вы можете использовать AST от haskell-src-exts, который поддерживает больше синтаксиса Haskell, чем TH.

+1

Почему, по вашему мнению, АСТ не напрямую переходит в GHC? Это честно удивит меня. – melpomene

+0

Название не похоже на вопрос. Я предположил, что вы искали '-ddump-splices' – jberryman

+0

@jberryman Я согласен. Пожалуйста, предложите лучшую. –

ответ

6

Я уверен, что AST не отправляется напрямую в GHC, так что в любом случае будет печать, а затем и парсинг.

Почему вы так думаете? Это не так, TH AST преобразуется непосредственно в GHC внутри АСТ; он никогда не преобразуется обратно в текст в любой момент этого процесса. (Если это так, то было бы довольно странно.)

Тем не менее, было бы несколько хорошо, если шаблон Haskell разоблачил способ синтаксического анализа источника Haskell для выражений, типов и деклараций, в основном подвергая парсер за различные e, t , и d котировок, которые встроены в Template Haskell. К сожалению, это не так, и я не думаю, что в настоящее время есть какие-то планы по его изменению.

В настоящее время вы должны пройти haskell-src-exts. Это несколько меньше, чем идеально, поскольку - это различия между парсером и GHC haskell-src-exts, но это так хорошо, как вы сейчас собираетесь получить. Чтобы уменьшить боль, есть , что мосты haskell-src-exts и template-haskell.

Для вашего варианта использования вы можете использовать функцию parseDecs от Language.Haskell.Meta.Parse, которая имеет тип String -> Either String [Dec], что и есть то, что вы ищете.

+0

Хм, это почти достаточно хорошо, но он по-прежнему не помогает в таких вещах, как TH, необъяснимо не поддерживающих приложения видимого типа, в то время как 'haskell-src-exts' делает. Не говоря уже о комментариях/документах. –

+0

Относительно [почему шаблон Haskell не предоставляет синтаксический анализатор для котировок] (http://stackoverflow.com/a/40985623/3072788). – Alec

+0

@Alec Итак, предположительно [предложение о нативном метапрограммировании] (https://ghc.haskell.org/trac/ghc/wiki/NativeMetaprogramming), это намного облегчит? –

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