True, although the final (rev a) (rev b) loses some of the speed benefit in the tail-recursion. If we didn't care about order (which happens quite often) we can drop the (rev ...) things. Otherwise, we can use a modulo-cons form, but this exceedingly complicated.
accums seems good... I suggest pushing it on nex-3's arc-wiki.
What I would like to see is a proper order-preserving accum. Here's a try at a "reasonably efficient" implementation:
(mac accumf (accfn . body)
" Collects or accumulates the values given to all calls to `accfn' within
`body' and returns a list of those values. The returned list
is in the same order as calls to `accfn'.
See also [[accum]] [[summing]] "
(w/uniq (hd tl)
`(let (,hd ,tl ,accfn) nil
(= ,accfn
(fn (s)
(if ,hd
(do (= ,hd (cons s nil)) (= ,tl ,hd))
(do (= (cdr ,tl) (cons s nil)) (= ,tl (cdr ,tl))))))
,@body
hd))))
Thanks for your answers ! I think that might be an interesting functionnality to add in the core functions. I used it a few times, in quite different contexts. Partitioning a list from a given criteria looks like a frequent action...