I don't know about the rest of this thread, but loom seems to suffer from what I've outlined in http://dev.clojure.org/jira/browse/CLJ-322?focusedCommentId=32246&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-32246 pulling in the interface that the protocol generates instead of the protocol.
On 10/26/13, 5:42 PM, Aysylu Greenberg wrote: > I was wondering if anybody has found a solution to this problem. I'm > experiencing the same issue in this project <https://github.com/aysylu/loom>. > If you disable aot (this > line<https://github.com/aysylu/loom/blob/master/project.clj#L9>), > the tests start failing with a similar error message. > > Thanks, > Aysylu > > On Thursday, April 18, 2013 8:27:53 AM UTC-4, Ragnar Dahlén wrote: >> >> Thank you for your explanation. I also suspect there is some subtle >> issue with the class file being used by the different constructors. >> >> However, I would be surprised if this behaviour is intended, and that >> the 'hackery' you proposed is the only, and prefered way of solving this. >> >> To better illustrate the core issue, I updated the example slightly >> as follows: >> >> Premise: >> defrecordissue.arecord and defrecordissue.protocol constitute some >> library. >> >> 1. defrecordissue.arecord defines a record type, and a function that >> will return an instance of the record: >> >> (ns defrecordissue.arecord) >> >> (defrecord ARecord []) >> >> (defn make-record >> [] >> (->ARecord)) >> >> 2. defrecordissue.protocol defines a protocol, and extends it to the >> record type defined in 1. It also defines a public function >> intended to be used by libraries: >> >> (ns defrecordissue.aprotocol >> (:require [defrecordissue.arecord]) >> (:import [defrecordissue.arecord ARecord])) >> >> (defprotocol AProtocol >> (afn [this])) >> >> (extend-protocol AProtocol >> ARecord >> (afn [this] 42)) >> >> (defn some-public-fn >> [] >> (afn (defrecordissue.arecord/make-record))) >> >> 3. defrecordissue.consumer is a consumer of the library, knows >> nothing of any protocols or records, but only wants to call a >> function thats part of the public api: >> >> (ns defrecordissue.consumer >> (:require [defrecordissue.aprotocol])) >> >> (defrecordissue.aprotocol/some-public-fn) >> >> This fails with the same root cause. >> >> I've created a new branch for this in the GitHub repo. >> >> https://github.com/ragnard/defrecordissue/tree/more-realistic >> >> /Ragge >> >> On Thursday, 18 April 2013 12:19:35 UTC+1, Andrew Sernyak wrote: >>> >>> I guess extend-type does changes only to generated java class and the var >>> defrecordissue.arecord->ARecord >>> contains the 'old' version of ARecord constructor. Obviously it would be >>> weird for defprotocol to change the variable in another namespace. >>> Especially when you can extend a record from anywhere. >>> >>> So If you want to create a record that implements your protocol via var >>> from record namespace, you should do some hackery to update that variable. >>> I've done a pull-request for you, but using direct constructor will be more >>> idiomatic >>> >>> ; >>>> ; this won't work unless you update manualy a variable ->ARecord in the >>>> namespace >>>> ; >>>> ;(defrecordissue.aprotocol/afn (defrecordissue.arecord/->ARecord)) >>>> ; >>>> ; like >>>> (defmacro from-ns[nmsps & body] >>>> "launches body from namespace" >>>> `(binding >>>> [*ns* (find-ns ~nmsps)] >>>> (eval >>>> (quote (do ~@body))))) >>>> (from-ns 'defrecordissue.arecord >>>> (import '(defrecordissue.arecord.ARecord)) >>>> (alter-var-root >>>> ('->ARecord (ns-publics 'defrecordissue.arecord)) >>>> (fn[x] (fn[] (new ARecord))))) >>>> (println (defrecordissue.aprotocol/afn >>>> (defrecordissue.arecord/->ARecord))) >>>> ; 42 >>> >>> >>> ndrw >>> >> > -- And what is good, Phaedrus, And what is not good— Need we ask anyone to tell us these things?
signature.asc
Description: OpenPGP digital signature