All macros in an expression are expanded before any part of the expression is executed. So (assign k (h k)) will be expanded before each is executed, and at that point k has no value, so (eval k) will fail.
So you need to move eval into the result of the macro expansion, and avoid calling it in the macro expansion itself: