2013-11-01 2 views
0

Вы можете увидеть в этом простом примере, как это переименовывает тип и значение конструкторы из A в A_0 и A_1 при преобразовании из выражения цитаты к AST:Как ускользнуть от переименования символов в AST, генерируемых из цитаты выражения?

Prelude Language.Haskell.TH> runQ [d|data A = A|] 
[DataD [] A_0 [] [NormalC A_1 []] []] 

Как применять имена, чтобы остаться так, как я указывать?

+0

' [d | данные A = A |] 'на верхнем уровне делают« данные A = A »без _1 или _0. Если вы делаете другие вещи с первым деком, я думаю, вы можете изменить 'NameFlavour' или игнорировать его. – aavogt

ответ

1

Название mangling похоже на то, что функция «Гигиенические макросы» вызывается в мире Lisp, где имена, используемые в выпущенном макрокоманде, искажены, так что они не мешают одинаковым именованным символам в коде, где макрос.

Синтаксис шаблона haskell в основном является ярлыком для генерации нормальных типов данных, определенных в пакете TH. В вас, например, вы можете использовать что-то вроде этого, чтобы иметь имя, которое вы хотите:

runQ (return $ [DataD [] (mkName "A") [] [NormalC (mkName "A") []] []]) 

Но помните, что это может привести к коллизии имен, если код, который использует этот макрос уже торможение данных с именем А.

+0

Такой позор, очень неинтуитивное поведение. Значит, вы говорите, что достичь этого невозможно? –

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

  • Нет связанных вопросов^_^