src/iterate-pre.lisp @ 3cddaf4f6564

Add `initial-value` and `modulo` to `summation` and `product`
author Steve Losh <steve@stevelosh.com>
date Wed, 07 Nov 2018 18:08:28 -0500
parents de9d10a9b4b5
children (none)
(in-package :losh.iterate-pre)

(defmacro-driver (FOR var IN-WHATEVER seq)
  "Iterate over items in the given sequence.

  Unlike iterate's own `in-sequence` this won't use the horrifyingly inefficient
  `elt`/`length` functions on a list.

  "
  (let ((kwd (if generate 'generate 'for)))
    (with-gensyms (is-list source i len)
      `(progn
        (with ,source = ,seq)
        (with ,is-list = (typep ,source 'list))
        (with ,len = (if ,is-list -1 (length ,source)))
        (for ,i :from 0)
        (,kwd ,var next (if ,is-list
                          (if ,source
                            (pop ,source)
                            (terminate))
                          (if (< ,i ,len)
                            (elt ,source ,i)
                            (terminate))))))))