@(do (defmacro while ((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)) (while ((< i 100)) (if (< (inc i) 20) continue) (if (> i 30) break) (prinl i))) (prinl (sys:expand '(while ((< i 100)) (if (< (inc i) 20) continue) (if (> i 30) break) (prinl i)))))