<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -501,20 +501,36 @@
 
 ; could bind index instead of gensym
 
+(def walk (seq func)
+  (if alist.seq
+        ((afn (l)
+           (when (acons l)
+             (func (car l))
+             (self (cdr l)))) seq)
+      (isa seq 'table)
+        (maptable (fn (k v) (func (list k v))) seq)
+      ; else
+        (for i 0 (- (len seq) 1)
+          (func (seq i)))))
+
 (mac each (var expr . body)
-  (w/uniq (gseq gf gv)
-    `(let ,gseq ,expr
-       (if (alist ,gseq)
-            ((rfn ,gf (,gv)
-               (when (acons ,gv)
-                 (let ,var (car ,gv) ,@body)
-                 (,gf (cdr ,gv))))
-             ,gseq)
-           (isa ,gseq 'table)
-            (maptable (fn ,var ,@body)
-                      ,gseq)
-            (for ,gv 0 (- (len ,gseq) 1)
-              (let ,var (,gseq ,gv) ,@body))))))
+  `(walk ,expr (fn (,var) ,@body)))
+
+; ; old definition of 'each. possibly faster, but not extendable.
+; (mac each (var expr . body)
+;   (w/uniq (gseq gf gv)
+;     `(let ,gseq ,expr
+;        (if (alist ,gseq)
+;             ((rfn ,gf (,gv)
+;                (when (acons ,gv)
+;                  (let ,var (car ,gv) ,@body)
+;                  (,gf (cdr ,gv))))
+;              ,gseq)
+;            (isa ,gseq 'table)
+;             (maptable (fn ,var ,@body)
+;                       ,gseq)
+;             (for ,gv 0 (- (len ,gseq) 1)
+;               (let ,var (,gseq ,gv) ,@body))))))
 
 ; (nthcdr x y) = (cut y x).
 </diff>
      <filename>arc.arc</filename>
    </modified>
    <modified>
      <diff>@@ -250,10 +250,14 @@
   &quot; Repeats the `body' `n' times.
     See also [[for]] [[forlen]] [[n-of]] &quot;
 
+  walk
+  &quot; Calls `func' on each element of `seq' for side-effects.
+    See also [[map]] [[each]] &quot;
+
   each
   &quot; Performs `body' for each element of the sequence returned by `expr',
     with each element assigned to `var'.
-    See also [[forlen]] [[on]] [[map]] [[ontable]] &quot;
+    See also [[walk]] [[forlen]] [[on]] [[map]] [[ontable]] &quot;
 
   cut
   &quot; Returns a subsequence of the given `seq'. If `end' is negative,</diff>
      <filename>help/arc.arc</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>470644baea39fdbb99a9fb434b03d0a2c44076d9</id>
    </parent>
  </parents>
  <author>
    <name>Michael Arntzenius</name>
    <email>daekharel@gmail.com</email>
  </author>
  <url>http://github.com/nex3/arc/commit/517b00282898992aa99db1371751a520469476e4</url>
  <id>517b00282898992aa99db1371751a520469476e4</id>
  <committed-date>2009-08-23T11:19:05-07:00</committed-date>
  <authored-date>2009-08-23T11:19:05-07:00</authored-date>
  <message>Refactor 'each into 'walk (fn) and 'each (mac)

This may be slower, but it follows the maxim to never create a macro where a
function will do. Also, it permits extending 'walk to change the semantics of
'each.</message>
  <tree>1c7bb47772f9ab00bf0b27fb340074009faadd84</tree>
  <committer>
    <name>Michael Arntzenius</name>
    <email>daekharel@gmail.com</email>
  </committer>
</commit>
