There are a several small things here that need fixing:
- in the “gran” section of your “extend”, you’re defining “blap” which is not
part of the gran protocol
- perhaps blip was intended
- the first argument in protocol function declarations refers to the object
itself, often named “this”
- calls to protocol functions don’t begin with “.”
- the call to (:blip this) had the wrong arity
Here is something similar that prints 6:
(ns aatree.record-play)
(defprotocol gran
(blip [this x y z]))
(defrecord wackel [])
(defn new-wackel [opts]
(let [w (->wackel)]
(into w opts)
(assoc w :blip (fn [this x y z] (+ x y z)))))
(extend wackel
gran
{:blip (fn [this x y z]
((:blip this) this x y z))})
(println (blip (new-wackel {}) 1 2 3))
- also consider extend-type in preference to extend here for its somewhat
friendlier syntax.
—Steve
> On Nov 24, 2015, at 11:30 AM, William la Forge <[email protected]
> <mailto:[email protected]>> wrote:
>
> This is not working for me:
>
> (ns aatree.record-play)
>
> (defprotocol gran
> (blip [x y z]))
>
> (defrecord wackel [])
>
> (defn new-wackel [opts]
> (let [w (->wackel)]
> (into w opts)
> (assoc w :blip (fn [this x y z] (+ x y z)))))
>
> (extend wackel
> gran
> {:blap (fn [this x y z]
> ((:blip this) x y z))})
>
> (println (.blap (new-wackel {}) 1 2 3))
>
> I get this: No matching method found: blap for class aatree.record_play.wackel
>
> I changed the println to this:
>
> (let [^gran w (new-wackel {})]
> (println (.blap w 1 2 3)))
>
> And now I get this: Unable to resolve classname: gran
>
> Clearly there is something about protocols and/or extend that I do not
> understand.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> <mailto:[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]
> <mailto:[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> <http://groups.google.com/group/clojure?hl=en>
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected]
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout
> <https://groups.google.com/d/optout>.
--
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
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.