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?

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to