The question is why you need macros and AST magic, for trivial thing, passing a proc to function.
This thing `template map*[T](coll: openArray[T], expr: untyped): untyped =` \- are you seriously propose to write code like this? So the whole codebase will be fragile and unmanageable mess with template here, untyped there, and macros over there? It's ok to use advanced code sparingly, when you really need it, it's not ok to use it everywhere.