diff --git a/scm.mes b/scm.mes index 5b563247..0c14d501 100755 --- a/scm.mes +++ b/scm.mes @@ -62,6 +62,12 @@ (let-loop ,bindings-or-label ,(car rest) ,(cdr rest))) (#t (simple-let ,bindings-or-label ,rest)))) +(define-macro (do init test . body) + `(let loop ((,(caar init) ,(cadar init))) + (when (not ,@test) + ,@body + (loop ,@(cddar init))))) + (define-macro (or2 x y) `(cond (,x ,x) (#t ,y))) diff --git a/test.mes b/test.mes index b417932d..ac2f601f 100644 --- a/test.mes +++ b/test.mes @@ -285,6 +285,8 @@ (pass-if "min 1" (seq? (min 0 1) 0)) (pass-if "min 2" (seq? (min 1 0 2) 0)) +(pass-if "do" (sequal? (let ((acc '())) (do ((i 0 (+ i 1))) ((>= i 3)) (set! acc (cons i acc))) acc) '(2 1 0))) + (newline) (display "passed: ") (display (car (result))) (newline) (display "failed: ") (display (cadr (result))) (newline)