diff --git a/goof.scm b/goof.scm index 82b83a6..642a2a7 100644 --- a/goof.scm +++ b/goof.scm @@ -397,3 +397,33 @@ (loop loop-name (clauses ...) => '() (cons (let () body ...) (loop-name)))))) + +(define-syntax loop/sum + (syntax-rules () + ((_ (clauses ...) body ...) + (loop (clauses ... (acc (summing (let () body ...)))) => acc)))) + +(define-syntax loop/product + (syntax-rules () + ((_ (clauses ...) body ...) + (loop (clauses ... (acc (multiplying (let () body ...)))) => acc)))) + +(define sentinel (list 'unique)) + +(define-syntax loop/first + (syntax-rules () + ((_ (clauses ...) body ...) + (loop loop-name ((acc (folding sentinel)) clauses ... :break (not (eq? sentinel acc))) + => (if (eq? sentinel acc) #f acc) + (let ((result (let () body ...))) + (loop-name (=> acc result))))))) + +(define-syntax loop/last + (syntax-rules () + ((_ (clauses ...) body ...) + (loop loop-name ((acc (folding sentinel)) clauses ...) => (if (eq? sentinel acc) #f acc) + (let ((result (let () body ...))) + (loop-name (=> acc result))))))) + + +