Hello,

In order to update fields in nested structures/maps easily
I have created a macro 'field-write'.
    (defmacro field-write [st k v access-spec]
      ; st=data, k=key to update, v=val to put, access-spec=access
vector
      ; ... code listing after interaction

    user=> nx
    {:a {:b {:c {:content 10}}}}
    user=> (field-write nx :content 1000 [:a :b :c])
    {:a {:b {:c {:content 1000}}}}
    user=> (macroexpand '(field-write nx :content 1000 [:a :b :c]))
    (clojure/assoc
      nx :a
      (clojure/assoc
        (clojure/-> nx :a) :b
        (clojure/assoc
          (clojure/-> nx :a :b) :c
          (clojure/assoc
            (clojure/-> nx :a :b :c):content 1000))))

[formatting added above for readability]

It seems to be working fine but I thought it may be
good to get inputs from the Clojure experts here to
see if there is a better way to do this in Clojure.

    (def nx {:a {:b {:c {:content 10}}}})

    (def field-write)
    (defmacro field-write [st k v access-spec]
      ; st=data, k=key to update, v=val to put, access-spec=access
vector
      (if (pred/empty? access-spec)
        `(assoc ~st ~k ~v)
        (field-write st (last access-spec)
                     `(assoc (-> ~st [EMAIL PROTECTED]) ~k ~v)
                     (butlast access-spec))))

Thanks.
Parth

--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to