You know, what I'm really thinking is that placing the annotations in the argslist looks horrible. The body itself is not bad, but the argslist is really, really horrible.
(do
; inefficient since we set it everytime the macro is called, but...
(set gs42 ; set so it won't say "redefined"
(fn (cond body)
((afn ()
(when (cond)
(body)
(self))))))
`(gs42 (fn () ,cond) (fn () ,@body)))
The above strikes me as being easier to implement.
Of course unfortunately it won't work properly for variable capture.
Edit: Hmm, maybe it'll actually be able to support some variable capture: