Hi,

Baishampayan beat me to it. But to elaborate more:

You have to expose each contract up the function chain. Say it looks like 
this:

    (defn calculate-insurance
      [& items]
      {:pre [(every? #(contains? % :cost-replace-with-new) items)]}
      ...)

Then funcE and funcD have to check this also. funcC doesn't because it adds 
said key to the data structure. If you change funcC to not add it, you'll 
also have to change funcC's contract. So you'd find the error in the call 
to funcD in funcC which is the first possible place to spot it (in case the 
change of contract was missed). If you'd change the contracts of the 
complete function chain, you'd spot it immediatelly in funcA.

This is similar to changing the type of the items from Insurable to 
WrappedInsurableAdapter or such. There are things which bubble up.

If you'd want something more akin classes and interfaces, you could use 
defrecord with (partial satisfies? PInsurable).

Sincerely
Meikel

/me is waiting for David and Ambrose coming up with contract checker 
written in core.logic.

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

Reply via email to