Nimのmacro
nim-by-example
Nimのmacro
1. Dump and examine the AST
2. Modify the AST to match the desired shape
構文木を受け取り、構文木を返す関数
渡された引数を分析し、現在の位置に任意の方法で新しいASTを作成できる(?)
But with templates you can only do constant substitutions in the AST. With macros you can analyze the passed arguments and create a new AST at the current position in any way you want.
他の言語と違って(?)、NimのmacroはNimで書けるので、他の文法を覚える必要がない
構造
code:txt
StmtList # ステートメントノード
Command # Commandノード
Ident "echo"
StrLit "Hello, World!"
手順
import macros
procの代わりにmacroを使用
newNimNode()でノードを作成、引数にノードの種類を指定
サンプル
code:nim
import macros
macro genEcho: untyped =
result = newNimNode(nnkStmtList)
result.add(
newNimNode(nnkCommand).add(
ident("echo"),
newStrLitNode("Hello, World!")
)
)
# マクロ呼び出し
# 当たり前だけどこれがないとマクロが実行されないので
genEcho()
ノードの構造を知る方法
dumpTree関数を使う
treeReprでも同じ出力(何が違う?)
code:Nim
import macros
dumpTree:
echo "Hello, World!"
# 出力
# StmtList
# Command
# Ident "echo"
# StrLit "Hello, World!"
code:nim
import macros
dumpTree:
result = 10
# 同じ結果
# static:
# echo treeRepr(parseStmt("result = 10"))
# 出力
# StmtList
# Asgn
# Ident ident"result"
# IntLit 10
いつ使うのか
何が嬉しいのか