如何获取TemplateHaskell命名变量的文字值

时间:2012-02-19 00:27:40

标签: haskell macros metaprogramming interpolation template-haskell

如果我在TemplateHaskell中有一个Name并且想要找出它命名的变量的值,只要该变量被声明为文字,可以这样做吗?

var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))

1 个答案:

答案 0 :(得分:4)

理论上,是的。在实践中,没有。

使用reify :: Name -> Q Info查找有关现有名称的内容,对于这样的定义,您将获得VarI值,其中包含Maybe Dec字段。这似乎表明你可能在某些情况下能够获得变量声明的语法树,这将允许你提取文字,但是current versions of GHC always returns Nothing in this field,所以你运气不好纯TH解决方案。

然而,TH确实允许运行任意IO动作,所以你可以通过使用像haskell-src-exts之类的东西自己加载和解析模块来解决这个问题,但我怀疑这会比它的价值更麻烦。