4

最近,我学习了如何实现具有反引用功能的准引用器,如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 -> ExpQExpQprintfQ

我的问题:是否有任何库函数可以将此字符串转换为 AST?有一些简单的方法可以做到这一点,还是我需要编写一个完整的 Haskell 解析器?

4

1 回答 1

5

洗完澡后,我想到了一个绝妙的主意:

嘿,如果我需要一个完整的 Haskell 解析器,为什么不使用现有的呢?

在该行进行了几次搜索后,我找到了答案:parseExp来自 http://hackage.haskell.org/package/haskell-src-meta-0.6.0.4/docs/Language-Haskell-Meta-Parse.html#v:解析Exp

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

https://github.com/nushio3/practice/tree/master/template-haskell/embed-expr

于 2013-10-19T14:34:15.323 回答