(map eval
(tree-subst 'loop 'loopform
(keep [and (caris _ 'mac) (in (cadr _) 'loop 'for 'down)]
(readfile "arc.arc"))))
(mac loop (withses . body)
(let w (pair withses)
`((rfn next ,(map car w) ,@body) ,@(map cadr w))))
I notice that I use afn often like this:
((afn (x y) ...) init-x init-y)
conanite made a macro named afnwith to encapsulate this pattern that I’m quite fond of:
(mac afnwith (withses . body)
(let w (pair withses)
`((afn ,(map car w) ,@body) ,@(map cadr w))))I imagine I’ll use this often enough that I’d like to call it “loop”, and use “next” to repeat the loop with new values:
arc> (loop (x 0)
(pr x " ")
(if (< x 10)
(next (+ x 1))))
0 1 2 3 4 5 6 7 8 9 10 nilArc of course already has a macro called “loop”. How to avoid conflicting with Arc’s loop? The Arc macros for and down use loop, so even if I never use Arc’s loop myself, I can’t redefine it without breaking for and down.
The map eval tree-subst code at the top reloads Arc’s definitions of loop, for, and down, renaming “loop” to “loopform”. I suppose a module system really would be more sensible, but rewriting Arc’s source code does feel pleasantly hackerish :-)
xloop for a version which doesn’t conflict with Arc’s loop.
Using the hackinator:
$ hack \
ycombinator.com/arc/arc3.1.tar \
awwx.ws/loop0.arc