Thanks, this works nice when wrapping a for loop. But I've tried it (naively) in the follow way which fails
macro toIter first type mismatch at position: 1 required type for x: ForLoopStmt but expression 'fibonacci()' is of type: iterator (): int{.closure.} Here is my example import strutils, sequtils import macros {.experimental: "forLoopMacros".} macro toItr*(x : ForLoopStmt): untyped = let expr = x[0] let call = x[1][1] # Get foo out of tolItr(foo) let body = x[2] result = quote do: block: let itr = `call` for `expr` in itr(): `body` iterator firstn(g:iterator():int, n:int): int = for i in 0..<n : yield g() proc fibonacci(): iterator(): int = result = iterator(): int = var a, b : int a = 0; b= 1 while true: yield a (a, b) = (b, a + b) for x in firstn(toItr(fibonacci()), 10) : echo x Run