To be honest this is a bit meaningless. You could handwrite boilerplate to "do the job" without using a more powerful construct, but it's not good practice.
Maybe the way is to pick which option increases productivity while keeping complexity to a minimum. If you had a macro that was useful but received inputs in an eldritch way, that would hinder your productivity just as much as using a more powerful construct. If you use a macro for what a template can do, the implementation of it in template form will be much clearer than in macro form, so it will be harder to understand. You also shouldn't use templates whenever you want inline functions but that's still your choice. Macros are their own kind of tool. They are not an abstraction over functions or whatever, they are just invoked the same way. Because of this, I think Nim's macros have their own ecosystem compared to normal Nim code, and it's naturally less developed. I don't think it's perfectly figured out where to use them and how to use them in the best way possible, this is something that has to be gradually slowly discovered. I don't blame anyone for not using them. Does not mean they are necessarily useless.
