So you sort of write stuff that defines your language as a 'macro' (and it looks like the rest of the lisp?) and it executes on your code first to transform it?
Yes, thats where the power of lisp is.
Say we want to implement do/while. In Python you would have to go into the compiler. In a Lisp, like Hy. We can just write it as a macro.
It is a little more involved, but basically you define a syntax for list comprehension and then parse it using the macro to generate the final result.