> The following code shows surprising behavior related to using protocol > functions in higher order functions. I sort of understand the reason > wrapped-x first fails is that calling extend-protocol in a sense > redefines the x protocol function. I can't decide if I think this is a > bug or just the way protocols work. I am curious what others think. > > -David > > ==== > > (defprotocol Foo > (x [this arg])) > > (defn wrap [f] > (fn [& args] > (apply f args))) > > (def wrapped-x (wrap x)) > > (extend-protocol Foo > String > (x [this arg] > (str this arg))) > > (wrapped-x "hello" "joe") > ;; -> No implementation of method: :x of protocol: #'user/Foo found > for class: java.lang.String > > (def wrapped-x (wrap x)) > > (wrapped-x "hello" "joe") > ;; -> "hellojoe"
I think not a bug. If you want indirection in your wrapper, you can ask for it, e.g.: (defn wrap [f] (fn [& args] (apply @f args))) (def wrapped-x (wrap #'x)) Stu Stuart Halloway Clojure/core http://clojure.com -- 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