@(do (set *gensym-counter* 0) (defmacro whilst ((condition : result) . body) (let ((cblk (gensym "cnt-blk-")) (bblk (gensym "brk-blk-"))) ^(macrolet ((break (value) ^(return-from ,',bblk ,value))) (symacrolet ((break (return-from ,bblk)) (continue (return-from ,cblk))) (block ,bblk (for () (,condition ,result) () (block ,cblk ,*body))))))) (let ((i 0)) (whilst ((< i 100)) (if (< (inc i) 20) continue) (if (> i 30) break) (prinl i))) (prinl (sys:expand '(whilst ((< i 100)) (if (< (inc i) 20) continue) (if (> i 30) break) (prinl i)))) (let ((i 0)) (whilst ((< i 5)) (inc i) (labels ((whilst () 'whilst)) (let ((break 'break)) (prinl (list (whilst) break)))))))