Here you go: import macros template myTemplate(x): untyped = (x, 3) macro flatten(x: typed): untyped = result = newNimNode(nnkBracket, x) for y in x: if y.kind == nnkTupleConstr and y.len == 2: result.add y[0] result.add y[1] else: result.add y result = newCall("@", result) var a: seq[int] = flatten((1, myTemplate(13), 2)) assert(a == @[1, 13, 3, 2]) Run
But the original code in C is convoluted, why replicate it.