> 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