我想要一个TemplateHaskell函数variablesInScope :: Q [Name]
,它返回范围内所有变量的Name
列表。 TemplateHaskell显然有这些信息可用于实现reify :: Name -> Q Info
和lookupValueName :: String -> Q (Maybe Name)
等功能。
我想要的功能是否存在于某处,我只是忽略了它?或者它可以以某种方式轻松构建?
答案 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来完成。