Details
-
Type:
Enhancement
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: Release 1.5
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
Description
A common pattern in programming is building up some data structure step by step:
In Python:
[code]
x = {0: 1}
for item in stuff:
x[item] = item * x.get(item - 1, 0)
[/code]
etc.
In an imperative for loop this is easy since we have easy access to the "current" data structure being built up.
I propose the addition of a function for-as similar to as-> except the value of the last loop iteration is bound to the name.
So we can write the above as:
[code]
(last (for-as [x {0 1}]
[item stuff]
(assoc x item (* item (get x (- item 1) 0)))))
[/code]
An (un-optimized) implementation might be something like:
[code]
(defmacro reduce-for [[res init] for-seq-exprs body-expr]
`(reduce #(%2 %1) ~init
(for ~for-seq-exprs
(fn [~res]
~body-expr))))
[/code]
Note: reduce-for does not return a seq, instead it returns the result of the last loop body iteration.
(Fixed formatting)
x = {0: 1} for item in stuff: x[item] = item * x.get(item - 1, 0)(last (for-as [x {0 1}] [item stuff] (assoc x item (* item (get x (- item 1) 0)))))(Someone please fix the formatting in above and delete this comment.)
x = {0: 1} for item in stuff: x[item] = item * x.get(item - 1, 0)(last (for-as [x {0 1}] [item stuff] (assoc x item (* item (get x (- item 1) 0)))))