<div>> What about looping over arrays and objects?</div><div><br></div><div>Here are some examples for you. PS's LOOP mostly, but not entirely,</div><div>agrees with CL's LOOP. So for example you can not only :COLLECT</div>


<div>things, as Boris illustrated, but :APPEND them if they happen to be</div><div>lists (arrays, of course, in JS):</div><div><br></div><div>  (loop :for arr :in '((10 20) (30 40)) :append (reverse arr))</div><div>  => (20 10 40 30)</div>


<div><br></div><div>You can do numeric things like SUM, COUNT, MINIMIZE, and MAXIMIZE:</div><div><br></div><div>  (loop :for i :in '(10 20 30 40) :sum i)</div><div>  => 100</div><div><br></div><div>You can bind to destructuring lists rather than symbols, using </div>


<div>the same notation as BIND:</div><div><br></div><div>  (loop :for (a (nil b)) :in '((10 (20 30)) (100 (200 300)))</div><div>     :collect (list a b))</div><div>  => ((10 30) (100 300))</div><div><br></div><div>


  (loop :for ((:a) (:b)) :in (list (list (create a 10 b 20) (create a 55 b 88))</div><div>                                   (list (create a 100 b 200) (create a 555 b 888)))</div><div>        :collect (list a b))</div><div>


  => ((10 88) (100 888))</div><div><br></div><div>Those examples use contrived literals, but the notation is very useful</div><div>when iterating over object/array collections.</div><div><br></div><div>In addition, PS's LOOP has :MAP..TO and :OF, which are designed for</div>


<div>working with JS objects. These are not derived from CL. CL LOOP's</div><div>provisions for iterating over hash tables are cumbersome and not quite</div><div>a good fit for JS, so we introduced these. </div><div>

<br>
</div><div>To iterate over the keys of an object:</div><div><br></div><div>  (loop :for k :of (create :a 1 :b 2) :collect k)</div><div>  => ("a" "b")</div><div><br></div><div>To iterate over the key-value pairs:</div>


<div><br></div><div>  (loop :for (k v) :of (create :a 1 :b 2) :collect (list k v))</div><div>  => (("a" 1) ("b" 2))</div><div><br></div><div>To iterate over just the values:</div><div><br></div><div>


  (loop :for (nil v) :of (create :a 1 :b 2) :sum v) </div><div>  => 3</div><div><br></div><div>To destructure the values:</div><div><br></div><div>  (loop :for (id (:name)) :of (create 123 (make :name "joe" :num 9) </div>


<div>                                      345 (make :name "ann" :num 10))</div><div>          :collect (list id name))</div><div>  => (("123" "joe") ("345" "ann"))</div>


<div><br></div><div>To build a new object, use :MAP key :TO value:</div><div><br></div><div>  (loop :for str :in '("abc" "xy" "defg") :map str :to (length str))</div><div>  => { abc 3 defg 4 xy 2 }</div>


<div><br></div><div>It would be great to have a tutorial showing what amazing things you</div><div>can do when you compose the different pieces of LOOP together. But in</div><div>the meantime I hope this helps. Please post any other questions you</div>


<div>have, and if you find any bugs, definitely post those.</div><div><br></div><div>Daniel</div><br><div class="gmail_quote">On Tue, Jan 15, 2013 at 1:05 PM, David Sargeant <span dir="ltr"><<a href="mailto:david@dsargeant.com" target="_blank">david@dsargeant.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks for sharing that.  What about looping over arrays and objects?<br>
<br>
<br>
David<br>
<br>
_______________________________________________<br>
parenscript-devel mailing list<br>
<a href="mailto:parenscript-devel@common-lisp.net" target="_blank">parenscript-devel@common-lisp.net</a><br>
<a href="http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel" target="_blank">http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel</a><br>
</blockquote></div><br>