使用自定义quasiquoter的输入作为实际代码

时间:2014-05-29 09:32:42

标签: haskell template-haskell

假设我有一个自定义的quasiquote,名为xpto:

[xtpo|data Something = Abc | Def deriving (Eq,Ord,Show,Enum,Bounded)|]

我想实际声明这个,但另外根据构造函数名称派生更多东西。最后一部分已完成(函数generateDataDefs,这里不相关),但我正在通过haskell-src-meta包含原始声明,这似乎是一个非常重的依赖。像这样:

xpto = QuasiQuoter { quoteDec = either (const . return $ []) generateDataDefs
                                                           . parseDecs }

我可以避免使用parseDecs而只使用模板Haskell吗?

PS:函数generateDataDefs接收[Dec],并将新代码附加到它:

generateDataDefs :: [Dec] -> Q [Dec]
generateDataDefs decData = let
(...)
 in return $ decData ++ remainingStuff

1 个答案:

答案 0 :(得分:1)

你不能使用quasiquoter,并让用户写

    generateDataDefs =<< [d|data Something = Abc
                                        | Def
                              deriving (Eq,Ord,Show,Enum,Bounded)|]