Open2
NimのFor loop macro
For loop macroを使えばfor文をマクロでイジることができる
for文で使うことを明示するため、引数の型はuntyped
ではなくForLoopStmt
という専用のものを使う
import std/macros
macro example(loop: ForLoopStmt) =
result = newTree(nnkForStmt) # Create a new For loop.
result.add loop[^3] # This is "item".
result.add loop[^2][^1] # This is "[1, 2, 3]".
result.add newCall(bindSym"echo", loop[0])
for item in example([1, 2, 3]): discard
これは次のように展開される
for item in items([1, 2, 3]):
echo item
For statementの構文木
for ident1, ident2 in expr1:
stmt1
このfor文は以下のように解釈される
nnkForStmt(ident1, ident2, expr1, stmt1)
構造を見ると、in
の前までの識別子とin
の後の識別子が羅列されているだけなのでin
の前後をどう区別しているか疑問だったけど、nnkで区別しているっぽい
なのでこのようにin
の前にnnkIdent
以外のものが来るやつはmacro側でエラーになる
for item() in items([1, 2, 3]):
discard