如何允许在AntiCotes中不仅嵌入值,而且嵌入任意haskell表达式

如何允许在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”和“

最近,我在下面的代码中学习了如何使用AntiNote功能实现QuasiQuoter,如
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

      我为此编写了一个独立的示例:


      不久前我问了同样的问题: