diff options
Diffstat (limited to 'stdlib/arith-each.tl')
-rw-r--r-- | stdlib/arith-each.tl | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/stdlib/arith-each.tl b/stdlib/arith-each.tl new file mode 100644 index 00000000..b0be94ab --- /dev/null +++ b/stdlib/arith-each.tl @@ -0,0 +1,54 @@ +;; Copyright 2021 +;; Kaz Kylheku <kaz@kylheku.com> +;; Vancouver, Canada +;; All rights reserved. +;; +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions are met: +;; +;; 1. Redistributions of source code must retain the above copyright notice, +;; this list of conditions and the following disclaimer. +;; +;; 2. Redistributions in binary form must reproduce the above copyright notice, +;; this list of conditions and the following disclaimer in the documentation +;; and/or other materials provided with the distribution. +;; +;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +;; POSSIBILITY OF SUCH DAMAGE. + +(defmacro sum-each (vars . body) + (with-gensyms (accum) + ^(let ((,accum 0)) + (each ,vars + (inc ,accum (progn ,*body))) + ,accum))) + +(defmacro sum-each* (vars . body) + (with-gensyms (accum) + ^(let ((,accum 0)) + (each* ,vars + (inc ,accum (progn ,*body))) + ,accum))) + +(defmacro mul-each (vars . body) + (with-gensyms (accum) + ^(let ((,accum 1)) + (each ,vars + (set ,accum (* ,accum (progn ,*body)))) + ,accum))) + +(defmacro mul-each* (vars . body) + (with-gensyms (accum) + ^(let ((,accum 1)) + (each* ,vars + (set ,accum (* ,accum (progn ,*body)))) + ,accum))) |