What about looping over arrays and objects?
Here are some examples for you. PS's LOOP mostly, but not entirely, agrees with CL's LOOP. So for example you can not only :COLLECT things, as Boris illustrated, but :APPEND them if they happen to be lists (arrays, of course, in JS):
(loop :for arr :in '((10 20) (30 40)) :append (reverse arr)) => (20 10 40 30)
You can do numeric things like SUM, COUNT, MINIMIZE, and MAXIMIZE:
(loop :for i :in '(10 20 30 40) :sum i) => 100
You can bind to destructuring lists rather than symbols, using the same notation as BIND:
(loop :for (a (nil b)) :in '((10 (20 30)) (100 (200 300))) :collect (list a b)) => ((10 30) (100 300))
(loop :for ((:a) (:b)) :in (list (list (create a 10 b 20) (create a 55 b 88)) (list (create a 100 b 200) (create a 555 b 888))) :collect (list a b)) => ((10 88) (100 888))
Those examples use contrived literals, but the notation is very useful when iterating over object/array collections.
In addition, PS's LOOP has :MAP..TO and :OF, which are designed for working with JS objects. These are not derived from CL. CL LOOP's provisions for iterating over hash tables are cumbersome and not quite a good fit for JS, so we introduced these.
To iterate over the keys of an object:
(loop :for k :of (create :a 1 :b 2) :collect k) => ("a" "b")
To iterate over the key-value pairs:
(loop :for (k v) :of (create :a 1 :b 2) :collect (list k v)) => (("a" 1) ("b" 2))
To iterate over just the values:
(loop :for (nil v) :of (create :a 1 :b 2) :sum v) => 3
To destructure the values:
(loop :for (id (:name)) :of (create 123 (make :name "joe" :num 9) 345 (make :name "ann" :num 10)) :collect (list id name)) => (("123" "joe") ("345" "ann"))
To build a new object, use :MAP key :TO value:
(loop :for str :in '("abc" "xy" "defg") :map str :to (length str)) => { abc 3 defg 4 xy 2 }
It would be great to have a tutorial showing what amazing things you can do when you compose the different pieces of LOOP together. But in the meantime I hope this helps. Please post any other questions you have, and if you find any bugs, definitely post those.
Daniel
On Tue, Jan 15, 2013 at 1:05 PM, David Sargeant david@dsargeant.com wrote:
Thanks for sharing that. What about looping over arrays and objects?
David
parenscript-devel mailing list parenscript-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel