最近,我学习了如何实现具有反引用功能的准引用器,如printfQ
下面的代码:
main = do
let itemName = "apple"
price = 1.29
[printfQ| The price of #{itemName} is #{price}. |]
quasiquote 的成分字符串将被传递给quoteExp printfQ :: String -> ExpQ
. 所以我们要做的是解析给定的String
,找到要嵌入的名称"itemName"
和"price"
,申请varE . mkName
每个名称,然后构建ExpQ
.
现在假设我想扩展它printfQ
以允许表达式嵌入,如下所示:
[printfQ| The price of #{itemNames !! i} is #{price + taxOf price}. |]
我可以编写检测两个字符串"itemNames !! i"
和"price + taxOf price"
. 但是我需要一个更强大的版本,一个将这些字符串转换varE . mkName
为的类型函数,将它们解释为引用所使用的命名空间的表达式。String -> ExpQ
ExpQ
printfQ
我的问题:是否有任何库函数可以将此字符串转换为 AST?有一些简单的方法可以做到这一点,还是我需要编写一个完整的 Haskell 解析器?
- 这个问题与这个问题密切相关。Is there a template haskell function for quoting? 我发布此消息是希望以更集中和更清晰的方式陈述问题可以帮助社区找到答案。