生成代码

生成代码有两种方式。通过用含有多个 newTreenewLit 调用的表达式创建语法树,或者用 quote do: 表达式。 第一种为语法树生成提供最好的底层控制,第二种简短很多。如果你选择用 newTreenewLit 创建语法树, marcos.dumpAstGen 宏可以帮你很多。 quote do: 允许你直接写希望生成的代码,反引号用来插入来自 NimNode 符号的代码到生成的表达式中。 这表示你无法在 quote do: 使用反引号做除了注入符号之外的事情。确保只注入 NimNode 类型的符号到生成的语法树中。 你可以使用 newLit 把任意值转换成 NimNode 表达式树类型, 以便安全地注入到树中。

  1. import macros
  2.  
  3. type
  4. MyType = object
  5. a: float
  6. b: string
  7.  
  8. macro myMacro(arg: untyped): untyped =
  9. var mt: MyType = MyType(a:123.456, b:"abcdef")
  10.  
  11. # ...
  12.  
  13. let mtLit = newLit(mt)
  14.  
  15. result = quote do:
  16. echo `arg`
  17. echo `mtLit`
  18.  
  19. myMacro("Hallo")

调用myMacro将生成下面的代码:

  1. echo "Hallo"
  2. echo MyType(a: 123.456'f64, b: "abcdef")