On 14 June 2011 12:37, Matthew Phillips <[email protected]> wrote:
> The only way I can think of to write it in Clojure is:
>
> (reduce
> (fn [items op]
> (let [items1 (if (:delete op) (drop-index (:delete op) items)
> items)]
> (if (:insert op) (cons (:insert op) items1) items1)))
> items ops)
>
> i.e. I'm using a cascade of conditional let's. This isn't _too_ bad in
> this case, but you can image how unreadable this could get.
>
How about something like this (borrowing from Mark's loop/recur suggestion
above):
(defn maybe-delete [items op]
(if-let [index (:delete op)]
(drop-index index items)
items))
(defn maybe-insert [items op]
(if-let [new-item (:insert op)]
(cons new-item items)
items))
(loop [items items ops ops]
(if-not ops
items
(let [op (first op)]
(recur (-> items
(maybe-delete op)
(maybe-insert op))
(next ops)))))
Looks more verbose on the surface, but I'm sure you could abstract away some
common bits of maybe-delete and maybe-insert using a macro.
Regards,
Stuart
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en