我想要一个TemplateHaskell函数variablesInScope :: Q [Name],它返回作用域中所有变量的Name列表。TemplateHaskell显然有这个信息,以便实现像reify :: Name -> Q Info和lookupValueName :: String -> Q (Maybe Name)这样的函数。
我想要的函数是否存在于某个地方,而我只是忽略了它?或者它可以以某种方式轻松构建?
发布于 2016-07-27 02:15:21
不幸的是,仅使用TH 是无法做到这一点的。尝试将Haskell模块解析为haskell-src-meta TH AST**.**的
不过,它将需要Q monad的IO功能来加载模块。
请参考以查看当前的粗略规格
(1)将Module ModuleInfo (从ModuleInfo reifyModule获取)扩展到模块,其中仍然是导入列表,Name包含模块的导出名称列表。
(2)添加生成当前模块的thisModule ::q模块。
(3)添加topLevelNames ::q名称,生成绑定在当前模块中的顶级名称(导出和非导出)的列表,该列表将对reify可见。
(4)添加nestedNames ::q Name,生成在此上下文中可见的非顶级(嵌套)名称的列表。
(5)添加parentNames ::q Name,生成与当前拼接上下文直接关联的名称列表。例如,foo,bar ::$(typeSplice)将看到foo,bar,foo = $(exprSplice)将看到foo,$(topLevelDecSplice)将看到[]。
(6)可选添加isTopLevel ::Name -> q Bool,检测名称是否绑定在(当前模块?)的顶层。类似这样的事情也可以通过搜索topLevelNames.来完成
https://stackoverflow.com/questions/26394199
复制相似问题