Open2

NimのFor loop macro

NeoNeo

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
NeoNeo

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