@(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
     (ignwarn
       (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)))))))