In lisp, macros are just another way to abstract ideas.
This is an example from an incomplete ray-tracer written in clojure:
(defmacro per-pixel
"Macro.
Excecutes body for every pixel. Binds i and j to the current pixel coord."
[i j & body]
`(dotimes [~i @width]
(dotimes [~j @height]
~@body)))
If you want to do something to every pixel with coordinates (i,j), say, draw a black pixel if i is even, you would write:
(per-pixel i,j
(if (even? i)
(draw-black i,j)))
This is not possible to do without macros because @body can mean anything inside (per-pixel i j @body)
Something like this would be possible in python as well. You need to use decorators.
You can't do everything you can do with lisp macros, but they are very powerful
Check out this decorator tutorial:
http://www.artima.com/weblogs/viewpost.jsp?thread=240808