summaryrefslogtreecommitdiffstats
path: root/stdlib/arith-each.tl
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/arith-each.tl')
-rw-r--r--stdlib/arith-each.tl22
1 files changed, 13 insertions, 9 deletions
diff --git a/stdlib/arith-each.tl b/stdlib/arith-each.tl
index 80f783c7..ba8c8c8a 100644
--- a/stdlib/arith-each.tl
+++ b/stdlib/arith-each.tl
@@ -34,15 +34,19 @@
(defmacro sys:arith-each (:form f op-iv vars . body)
(let* ((gens (mapcar (ret (gensym)) vars))
(syms [mapcar car vars])
- (accum (gensym)))
- ^(let* (,*(mapcar (ret ^(,@1 (iter-begin ,@2))) gens syms)
- (,accum ,(cdr op-iv)))
- (block nil
- (sys:for-op ()
- ((and ,*(mapcar (op list 'iter-more) gens)) ,accum)
- (,*(mapcar (ret ^(sys:setq ,@1 (iter-step ,@1))) gens))
- ,*(mapcar (ret ^(sys:setq ,@1 (iter-item ,@2))) syms gens)
- (set ,accum (,(car op-iv) ,accum (progn ,*body))))))))
+ (accum (gensym))
+ (op (car op-iv))
+ (iv (cdr op-iv)))
+ (if (null vars)
+ iv
+ ^(let* (,*(mapcar (ret ^(,@1 (iter-begin ,@2))) gens syms)
+ (,accum ,iv))
+ (block nil
+ (sys:for-op ()
+ ((and ,*(mapcar (op list 'iter-more) gens)) ,accum)
+ (,*(mapcar (ret ^(sys:setq ,@1 (iter-step ,@1))) gens))
+ ,*(mapcar (ret ^(sys:setq ,@1 (iter-item ,@2))) syms gens)
+ (set ,accum (,op ,accum (progn ,*body)))))))))
(defmacro sum-each (:form f vars . body)
(sys:vars-check f vars)