`macroexpand` makes it less important to have a separate body-generating function. The main reason for the pain of `eval(ngenerate(...` is when your dict lookup sometimes has to be more complicated than just the dimensionality.