使用TemplateHaskell列出命名空间中的所有名称

时间:2014-10-16 00:08:20

标签: haskell template-haskell

我想要一个TemplateHaskell函数variablesInScope :: Q [Name],它返回范围内所有变量的Name列表。 TemplateHaskell显然有这些信息可用于实现reify :: Name -> Q InfolookupValueName :: String -> Q (Maybe Name)等功能。

我想要的功能是否存在于某处,我只是忽略了它?或者它可以以某种方式轻松构建?

1 个答案:

答案 0 :(得分:1)

很遗憾,您无法单独使用if(dice1 == dice2 && dice2 == dice3) { if(dice1 == round) printf("1"); else printf("2"); } else if(dice1 != round || dice2 != round || dice3 != round) print("3"); else fi(dice1 != round && dice2 != round && dice3 != round) print("4"); 执行此操作。尝试TH将Haskell模块解析为haskell-src-meta

虽然TH AST monad的IO功能需要加载模块。

请参考https://ghc.haskell.org/trac/ghc/ticket/9699#ticket查看当前的粗略规范

  

(1)将ModuleInfo(从reifyModule获得)扩展到ModuleInfo [Module] [Name],其中[Module]仍然是导入列表,[Name]包含模块的导出名称列表。< / p>      

(2)添加thisModule :: Q模块,生成当前模块。

     

(3)添加topLevelNames :: Q [Name],生成当前模块中绑定的顶级名称列表(包括导出的和未导出的),这些名称对于reify是可见的。

     

(4)添加nestedNames :: Q [Name](需要更好的名称),生成一个非顶级(嵌套)名称列表,以便在此上下文中显示。

     

(5)添加parentNames :: Q [Name](也需要更好的名称),生成与当前拼接上下文紧密关联的名称列表(如果可用)。例如,foo,bar :: $(typeSplice)会看到[foo,bar],foo = $(exprSplice)会看到[foo],而$(topLevelDecSplice)会看到[]。

     

(6)可选添加isTopLevel ::名称 - &gt; Q Bool检测名称是否绑定在顶层(当前模块?)。这样的事情可以通过搜索topLevelNames来完成。