On Apr 19, 11:00 am, Timo Mihaljov <[email protected]> wrote:
> I'm wondering about how to change a data structure without breaking the
> API used to access it. For example, let's assume that I have a library
> for dealing with records of people and I'm storing them in structs.
>
> (defstruct person :name)
>
> The users of my library access the data stored in the records like any
> other map.
>
> (:name some-person)
>
> When the library's been in use for a while, I realize that I need to
> make a change to the data structure.
>
> (defstruct :first-name :last-name)
>
> The problem is that making this change would break all the clients using
> the library.
I won't claim this is an elegant solution, but it's similar in spirit
to your Python example:
;; Original definition of person
(defn person [record]
(fn
([key] (key record))
([key value] (person (assoc record key value)))))
(def p1 (person {:name "Stuart Sierra"}))
(p1 :name)
;;=> "Stuart Sierra"
;; Now change the definition of person.
(defn person [record]
(fn
([key]
(if (= key :name)
(str (:first-name record) " " (:last-name record))
(key record)))
([key value]
(if (= key :name)
(throw (Exception. ":name cannot be set any more"))
(person (assoc record key value))))))
(def p2 (person {:first-name "Stuart" :last-name "Sierra"}))
(p2 :name)
;;=> "Stuart Sierra"
(def p3 (p2 :last-name "Halloway"))
(p3 :name)
;;=> "Stuart Halloway"
-Stuart Sierra
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---