This is pretty trivial, but it is maybe sometimes more natural to express
something as a cycling pattern of function applications over some data than
as one constant function.  The typical way of expressing those cases
involves twisting it around so that the data is rotated/alternated instead
of what you want which is a rotating sequence of functions in your map or
reduce.  I'm guessing something this has come up before on this list.

https://github.com/rplevy/reducycle/blob/master/src/red/ucycle.clj

On Thu, Nov 13, 2014 at 11:10 PM, Robert Levy <r.p.l...@gmail.com> wrote:

> I was just thinking about this some more. Here's a slightly less terrible
> idea:
>
> (defn rotate [coll]
>   (rest (take (inc (count coll))
>               (cycle coll))))
>
> (defn reducycle [fns init coll]
>   (let [fns-atom (atom fns)
>         alt-op (fn [& args]
>                  (swap! fns-atom rotate)
>                  (apply (first @fns-atom) args))]
>     (reduce alt-op init coll)))
>
> (reducycle [- +] 0 (range 1 10))
>
> On Thu, Nov 13, 2014 at 10:30 PM, Robert Levy <r.p.l...@gmail.com> wrote:
>
>> sorry, make that
>>
>> (*reduce alt-op *(*range 1 10)*)
>>
>> On Thu, Nov 13, 2014 at 10:28 PM, Robert Levy <r.p.l...@gmail.com> wrote:
>>
>>> (let [op (atom +)]
>>>   (defn alt-op [a b]
>>>     ((swap! op #(if (= % +) - +)) a b)))
>>>
>>> (map alt-op (range 1 10))
>>>
>>> On Thu, Nov 13, 2014 at 10:09 PM, Robert Levy <r.p.l...@gmail.com>
>>> wrote:
>>>
>>>> But for "applyv" you could do this:
>>>>
>>>> (*reduce + *(*map *(*comp eval list*) (*cycle *[*+ -*]) (*range 1 10*))
>>>> )
>>>>
>>>> On Thu, Nov 13, 2014 at 10:06 PM, Robert Levy <r.p.l...@gmail.com>
>>>> wrote:
>>>>
>>>>> Is that any more elegant than Dave's (reduce + (map * (cycle [1 -1])
>>>>> (range 1 n))) though?  I would say that's the best actually sensible
>>>>> answer proposed in this thread.
>>>>>
>>>>> On Thu, Nov 13, 2014 at 9:54 PM, Andy L <core.as...@gmail.com> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Nov 13, 2014 at 7:23 PM, Robert Levy <r.p.l...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> You don't need this for numbers over 900 right?
>>>>>>>
>>>>>>>
>>>>>> I see what you mean. But no, I just practice and try to capture
>>>>>> patterns. So, going after your example I got following:
>>>>>>
>>>>>> (reduce + (map applyv (cycle [+ -]) (range 1 10)))
>>>>>>
>>>>>> where something like applyv perhaps exists,
>>>>>> (defn applyv [f a] (f v)) - but I am not sure how to find it.
>>>>>>
>>>>>> A.
>>>>>>
>>>>>>
>>>>>>
>>>>>>  --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Clojure" group.
>>>>>> To post to this group, send email to clojure@googlegroups.com
>>>>>> Note that posts from new members are moderated - please be patient
>>>>>> with your first post.
>>>>>> To unsubscribe from this group, send email to
>>>>>> clojure+unsubscr...@googlegroups.com
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/clojure?hl=en
>>>>>> ---
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Clojure" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to clojure+unsubscr...@googlegroups.com.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to