如何允许在AntiCotes中不仅嵌入值,而且嵌入任意haskell表达式
最近,我在下面的代码中学习了如何使用AntiNote功能实现QuasiQuoter,如如何允许在AntiCotes中不仅嵌入值,而且嵌入任意haskell表达式,haskell,template-haskell,quotations,Haskell,Template Haskell,Quotations,最近,我在下面的代码中学习了如何使用AntiNote功能实现QuasiQuoter,如printfQ: main = do let itemName = "apple" price = 1.29 [printfQ| The price of #{itemName} is #{price}. |] quasikote的成分字符串将被传递到quoteExp printfQ::string->ExpQ。因此,我们要做的是解析给定的字符串,查找要嵌入的名称“itemName”和“
printfQ
:
main = do
let itemName = "apple"
price = 1.29
[printfQ| The price of #{itemName} is #{price}. |]
quasikote的成分字符串将被传递到quoteExp printfQ::string->ExpQ
。因此,我们要做的是解析给定的字符串
,查找要嵌入的名称“itemName”
和“price”
,应用变量。为每个名称创建mkName
,并构建ExpQ
现在假设我想扩展这个printfQ
,以允许表达式嵌入,如下所示:
[printfQ |{itemNames!!i}的价格是#{price+taxOf price}.|]
我可以编写解析器来检测两个字符串“itemNames!!I”
和“price+taxOf price”
。但是我需要一个更强大的varE版本。mkName
,一个类型为String->ExpQ
的函数,将这些字符串转换为ExpQ
,将它们解释为引用使用printfQ
的命名空间的表达式
我的问题:是否有库函数可以将字符串转换为AST?有没有一些简单的方法可以做到这一点,或者我需要编写一个完整的Haskell解析器
- 这个问题与我发布的这个问题密切相关,希望以更集中、更清晰的方式陈述这个问题可以帮助社区找到答案
- 洗完澡后,我想到了一个好主意:
嘿,如果我需要一个完整的Haskell解析器,为什么不使用现有的呢
在那行搜索了几遍后,我找到了我的答案:
parseExp
from
我为此编写了一个独立的示例:
不久前我问了同样的问题: