生成代码
生成代码有两种方式。通过用含有多个 newTree 和 newLit 调用的表达式创建语法树,或者用 quote do: 表达式。 第一种为语法树生成提供最好的底层控制,第二种简短很多。如果你选择用 newTree 和 newLit 创建语法树, marcos.dumpAstGen 宏可以帮你很多。 quote do: 允许你直接写希望生成的代码,反引号用来插入来自 NimNode 符号的代码到生成的表达式中。 这表示你无法在 quote do: 使用反引号做除了注入符号之外的事情。确保只注入 NimNode 类型的符号到生成的语法树中。 你可以使用 newLit 把任意值转换成 NimNode 表达式树类型, 以便安全地注入到树中。
- import macros
- type
- MyType = object
- a: float
- b: string
- macro myMacro(arg: untyped): untyped =
- var mt: MyType = MyType(a:123.456, b:"abcdef")
- # ...
- let mtLit = newLit(mt)
- result = quote do:
- echo `arg`
- echo `mtLit`
- myMacro("Hallo")
调用myMacro
将生成下面的代码:
- echo "Hallo"
- echo MyType(a: 123.456'f64, b: "abcdef")