<div dir="ltr">I shouldn't have used mapc as an example. Consider instead some random, opaque, map-like function that couldn't be rewritten into an iter form. In any case, your collectors library seems interesting. Will check it out, thanks!</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Mar 13, 2018 at 4:08 PM Russ Tyndall <<a href="mailto:russ@acceleration.net">russ@acceleration.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<p>Here are two different ways of rewriting that mapc with iter:<br>
</p>
<p>`(iter top (repeat 1) (iter (for x in '(1 2 3)) (in top (collect
x))))`</p>
<p>`(iter (repeat 1) (appending '(1 2 3)))`</p>
<p>`(iter (repeat 1) (appending (iter (for x in '(1 2 3)) (collect
x))))`</p>
<p>If I am using iter, I try hard to *only* use iter, as one of the
reasons for this library (for me) is to have a single syntax for
iteration.</p>
<p>That said, I wrote the `collectors` library to handle arbitrary
collection tasks that were not easily expressed as a straight
iteration.<br>
The collectors library binds local functions, so you can `(mapc
#'collect ...)` etc.</p>
<p><a class="m_-7401853855976486240moz-txt-link-freetext" href="https://github.com/AccelerationNet/collectors" target="_blank">https://github.com/AccelerationNet/collectors</a> <br>
</p>
<p>Cheers,</p>
<p>Russ Tyndall<br>
</p></div><div text="#000000" bgcolor="#FFFFFF">
<br>
<div class="m_-7401853855976486240moz-cite-prefix">On 03/13/2018 11:52 AM, Luís Oliveira
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Just a curiosity: you could compute the average
incrementally: <<a href="https://math.stackexchange.com/questions/106700/incremental-averageing" target="_blank">https://math.stackexchange.com/questions/106700/incremental-averageing</a>>,
but doing it the usual way is probably more efficient and with
smaller numeric error when using floats.</div>
<div><br>
</div>
<div>Slightly off-topic question: oftentimes I have to use
map-like iterators. Is there a good way to use such iterators
in conjunction with iter? An obvious way would be something
like:</div>
<div><br>
</div>
<div> (iter (repeat 1) (mapc (lambda (x) (collect x)) '(1 2
3)))</div>
<div><br>
</div>
<div>The (iter (repeat 1) ...) bit could be hidden under a
macro, I suppose. But it'd be nicer if collect were a
function, so I could do (mapc #'collect '(1 2 3)). Perhaps
said macro could rewrite #'clause to (lambda (x)
(expansion-of-clause x)) or something similar. Looks like a
fun idea to explore so I'm wondering if someone's played with
something like this before.</div>
<div><br>
</div>
<div>(It's even more fun to turn map-like iterators into
generators using continuations, but that's fully off-topic.
:-))</div>
<div><br>
</div>
<div>Cheers,</div>
<div>Luís</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr">On Tue, Mar 13, 2018 at 3:08 PM Russ Tyndall <<a href="mailto:russ@acceleration.net" target="_blank">russ@acceleration.net</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<p>Here is an existing "sampling" clause to pull a random
sample from a larger data set. The long and short is just
use a finally clause, as you would when writing a normal
iterate loop.</p>
<p>(iterate:defmacro-clause (sampling expr &optional
into var size size)<br>
"resevoir sample the input"<br>
(let ((sample (or var iterate::*result-var*)))<br>
(alexandria:with-unique-names (i sample-size sigil
buffer row)<br>
`(progn<br>
(with ,sample)<br>
(with ,sample-size = (or ,size 100))<br>
(with ,buffer = (make-array ,sample-size
:initial-element ',sigil))<br>
(with ,i = 0)<br>
(if (< ,i ,sample-size)<br>
(setf (aref ,buffer ,i) ,expr)<br>
(let ((r (random ,i)))<br>
(when (< r ,sample-size)<br>
(setf (aref ,buffer r) ,expr))))<br>
(incf ,i)<br>
(finally<br>
;; convert our sample to a list, but only if we
actually took the sample<br>
(when (plusp ,i)<br>
(setf ,sample<br>
(iter (for ,row in-vector ,buffer)<br>
(until (eq ,row ',sigil))<br>
(collect ,row)))))))))<br>
<br>
</p>
Cheers,<br>
Russ Tyndall<br>
Acceleration.net</div>
<div text="#000000" bgcolor="#FFFFFF"><br>
<div class="m_-7401853855976486240m_-2021505211364927429moz-cite-prefix">On
03/13/2018 10:49 AM, Robert Goldman wrote:<br>
</div>
<blockquote type="cite">
<div style="font-family:sans-serif">
<div style="white-space:normal">
<p dir="auto">I was going to define an <code style="background-color:#f7f7f7;border-radius:3px;margin:0;padding:0 0.4em" bgcolor="#F7F7F7">AVERAGING</code>
collector clause for iterate, but I'm not sure how
to do it. The obvious thing, it seemed to me, would
be to sum the values as I go along, and count them,
and then divide the sum by the count when leaving
the loop.</p>
<p dir="auto">But the examples for <code style="background-color:#f7f7f7;border-radius:3px;margin:0;padding:0 0.4em" bgcolor="#F7F7F7">DEFMACRO-CLAUSE</code> in
the manual do all of their work while iterating, and
there doesn't seem to be an "at-end" hook. Is the
kind of thing I would like feasible, and if so, how
is it to be done?</p>
<p dir="auto">thanks!<br>
r</p>
</div>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div></blockquote></div>