let-go
let-go copied to clipboard
Top-level `do`-s don't support `defmacro` inside
Consider:
(defmacro dude [] `(+ 1 2 3))
(dude) ;; => 6
However, wrapped in do
:
(do
(defmacro dude [] `(+ 1 2 3))
(dude)) ;; => (+ 1 2 3)
This happens because it gets compiled into
- def dude fn
- set-macro! dude
- call dude
When executing this, we have already left the compiler so the fact that dude
is a macro doesn't matter, it's just a plain function to the VM. The compiler didn't know (dude)
is to be macro-expanded because set-macro!
was only executed after compiler finished.