Re: defrecord and overriding empty
Well here I am over a year later with the same problem. I'm curious, what was your solution for the time being? On Tuesday, September 27, 2011 1:06:37 PM UTC-5, David Nolen wrote: On Tue, Sep 27, 2011 at 1:54 PM, Nathan Sorenson nd...@sfu.cajavascript: wrote: Should IPersistentCollection even be defining 'empty', if one of the language's key data types doesn't support it? I think it would be better to either pull 'empty' into it's own protocol so clojure.walk doesn't match on IPersistentCollection when walking a data structure with the false expectation that it can create an empty version, or rename 'empty' it to something that records can implement, like 'default.' This is a fair point. ClojureScript fixes this by providing IEmptyableCollection. David -- 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
Re: defrecord and overriding empty
In core.logic we have a protocol called IUninitialized that you can implement. That works well enough for our needs. On Saturday, December 15, 2012, Joseph Smith wrote: Well here I am over a year later with the same problem. I'm curious, what was your solution for the time being? On Tuesday, September 27, 2011 1:06:37 PM UTC-5, David Nolen wrote: On Tue, Sep 27, 2011 at 1:54 PM, Nathan Sorenson nd...@sfu.ca wrote: Should IPersistentCollection even be defining 'empty', if one of the language's key data types doesn't support it? I think it would be better to either pull 'empty' into it's own protocol so clojure.walk doesn't match on IPersistentCollection when walking a data structure with the false expectation that it can create an empty version, or rename 'empty' it to something that records can implement, like 'default.' This is a fair point. ClojureScript fixes this by providing IEmptyableCollection. David -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.comjavascript:_e({}, 'cvml', '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 javascript:_e({}, 'cvml', 'clojure%2bunsubscr...@googlegroups.com'); 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 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
defrecord and overriding empty
I'm using clojure.walk/postwalk to rewrite terms in nested data structures. However, I am unable to do this with types as defined by defrecord, because they specify that the function empty throw a not- implemented exception. If I were able to over-ride this default implementation of 'empty' I believe I could still use postwalk to rewrite my custom records (as they happily implement 'into' which works as expected.) This was my obvious first attempt: (defrecord TypeVar [guid name] clojure.lang.IPersistentCollection (empty [coll] (TypeVar. 0 nil))) Which fails due to: Duplicate method namesignature in class file types/TypeVar [Thrown class java.lang.ClassFormatError] I would prefer not to fall back on deftype as I do wish these objects to behave as maps. I also could write my own version of postwalk that doesn't call 'empty' on my custom-defined records, but it would be nice to make my types adhere to the contract of IPersistentCollection as much as possible. -- 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
Re: defrecord and overriding empty
The problem is what does empty mean in the context of defrecord? A new instance of a defrecord is not empty, it has those fields and they are set to nil. David On Tue, Sep 27, 2011 at 3:48 AM, Nathan Sorenson n...@sfu.ca wrote: I'm using clojure.walk/postwalk to rewrite terms in nested data structures. However, I am unable to do this with types as defined by defrecord, because they specify that the function empty throw a not- implemented exception. If I were able to over-ride this default implementation of 'empty' I believe I could still use postwalk to rewrite my custom records (as they happily implement 'into' which works as expected.) This was my obvious first attempt: (defrecord TypeVar [guid name] clojure.lang.IPersistentCollection (empty [coll] (TypeVar. 0 nil))) Which fails due to: Duplicate method namesignature in class file types/TypeVar [Thrown class java.lang.ClassFormatError] I would prefer not to fall back on deftype as I do wish these objects to behave as maps. I also could write my own version of postwalk that doesn't call 'empty' on my custom-defined records, but it would be nice to make my types adhere to the contract of IPersistentCollection as much as possible. -- 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
Re: defrecord and overriding empty
You're right that my use isn't strictly returning a collection with a size of zero-- I'm treating empty more like 'default'. I'm thinking of its use in clojure.walk, which simply creates a blank version of an arbitrary collection in which to place the altered sub-forms. I can't find any other usages of 'empty' in the std lib. I agree it's a bit of a mismatch, as 'walk' won't be able to alter the built-in keys of a record, but you wouldn't expect that to happen if you were using records. Should IPersistentCollection even be defining 'empty', if one of the language's key data types doesn't support it? I think it would be better to either pull 'empty' into it's own protocol so clojure.walk doesn't match on IPersistentCollection when walking a data structure with the false expectation that it can create an empty version, or rename 'empty' it to something that records can implement, like 'default.' -- 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