Added some simple versions of loop

loop/first loop/last loop/sum loop/product now added.
This commit is contained in:
Linus 2020-11-09 23:18:58 +01:00
parent 17d72f2cea
commit 80464ebe48

View file

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