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

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

我想要的function是否存在,我只是忽略了它? 或者可以很容易地build立?

不幸的是,你不能一个人做这个。 尝试haskell-src-meta来将Haskell模块parsing为TH AST

这将需要Q单元的IOfunction来加载模块。

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

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

(2)添加产生当前模块的thisModule :: Q模块。

(3)添加topLevelNames :: Q [Name],生成当前模块绑定的顶级名称(包括导出和非导出)的列表,这些名称将被可视化。

(4)添加nestedNames :: Q [Name](需要一个更好的名字),产生可视化的非顶级(嵌套)名称列表。

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

(6)可选添加isTopLevel :: Name – > Q Bool来检测名称是否绑定在当前模块的顶层? 这样的事情可以通过searchtopLevelNames来完成。