(in-package :hu.caleb.test) (def-suite :hu.caleb.call/cc :in :hu.caleb) (in-suite :hu.caleb.call/cc) (defvar *callcc-scrap* nil) (test simple-call/cc-1 (setq *callcc-scrap* nil) (let* ((fn (caleb:caleb '(lambda () (block lamb (dotimes (i 3) (push i *callcc-scrap*) (caleb::call/cc (lambda (k) (return-from lamb k)))) nil)))) (cont fn) (ctr 0)) (loop while (not (eq cont nil)) do (progn (push ctr *callcc-scrap*) (incf ctr) (setq cont (funcall cont)))) (is (equal *callcc-scrap* '(3 2 2 1 1 0 0))))) (test simple-call/cc-2 (setq *callcc-scrap* nil) (caleb:caleb '(let* ((fn (lambda (k-return) (dotimes (i 3) (push i *callcc-scrap*) (caleb::call/cc k-return)) (funcall k-return nil))) (cont fn) (ctr 0)) (loop while (not (eq cont nil)) do (progn (push ctr *callcc-scrap*) (incf ctr) (setq cont (caleb::call/cc cont)))))) (is (equal *callcc-scrap* '(3 2 2 1 1 0 0))))