Macros nim-自定义宏/pragma以获取完整模块的ast,但获取;无法附加自定义杂注";

Macros nim-自定义宏/pragma以获取完整模块的ast,但获取;无法附加自定义杂注";,macros,metaprogramming,nim-lang,Macros,Metaprogramming,Nim Lang,我想通过nim访问完整模块(文件)的AST。我发现,任何宏都可以用作自定义pragma,所以我在foo.nim文件中做了如下操作: import macros macro getAst(ast: untyped): untyped = echo "ast = ", treeRepr(ast) {.getAst.} # <-- This should invoke the getAst() macro with the AST of the file proc

我想通过nim访问完整模块(文件)的AST。我发现,任何宏都可以用作自定义pragma,所以我在foo.nim文件中做了如下操作:

import macros

macro getAst(ast: untyped): untyped =
  echo "ast = ", treeRepr(ast)

{.getAst.}  # <-- This should invoke the getAst() macro with the AST of the file

proc hello() =
  echo "hello world"    

无法将自定义杂注附加到文件,但您可以这样做

proc hello() {.getAst.} =
  echo "hello world"    
将pragma附加到进程。我不确定,但似乎
{.push.}
不适用于宏,只适用于
模板
杂注,如下所示:

template dbIgnore {.pragma.}

{.push dbIgnore.}
因此,最好的选择是使用pragma注释所有需要的过程


我知道可以为每个进程添加pragma,但我想要的是将所有进程添加到“全局”映射中。那可能吗?据我所知,我只会在进程上使用pragma时获得带注释进程的AST,我不知道如何从pragma宏中向“全局”AST添加内容。不可能获得全局AST,至少如果没有一些非常粗糙的术语重写解决方案。最好的选择是只使用pragma注释procs。
template dbIgnore {.pragma.}

{.push dbIgnore.}