[Cuis-dev] [Ann] Serialization of BlockClosures
Juan Vuletich
juan at jvuletich.org
Mon Sep 30 13:51:26 PDT 2019
(inline)
On 9/30/2019 4:46 PM, Phil B wrote:
> OK, now I understand what you are going for... this seems like a
> convenience optimization in the wrong place. Wouldn't it make more
> sense to have this logic in something like #elementSpecies?
No, this is not what I tried to do. 'Color red species = FloatArray'.
> Most of my code that uses #species with collections is expecting it to
> return what kind of collection it should use when creating some sort
> of collection-based copy/result, not an individual element.
That is exactly what I tried to do. For instance, Color is a suclass of
FloatArray, that adds the restriction that it must have 3 elements.
TranslucentColor is similar, but must be of size = 4. If you do a
#select: on them, the answer could have less than 3 (or 4) elements, and
then, the correct class for the answer is FloatArray and not Color. See
what happens with 'Color red select: [ :v | v > 0.5 ]'.
Does this reasoning apply to the examples you are seeing?
> Also, sometimes the collection *is* the element (i.e. Vector*) as far
> as most code is concerned.
Not sure how this relates to what #species answers... Maybe elaborate a
bit on this.
> Lots of FFI code uses ArrayedCollection subclasses for buffers of
> various types and you typically want #species to return the
> appropriate collection type (not always of the same class) when doing
> something with it.
Exactly. Besides, any collection class is free to redefine #species
appropriately.
> It also seems a bit weird for ArrayedCollection to sometimes return
> the class of its elements while other collections return the class of
> the collection itself (which it pretty much has to for
> heterogeneous collections.)
It should always be a collection class, that is appropriate as a result.
The problem I do see is that, perhaps, 'Color red collect: [ :v | v / 2
]' could answer an instance of Color. So maybe we could make the search
for an appropriate superclass in a separate message, like
#speciesForPotentiallyShorterResult (uhg that's ugly), and only call
this other method from #select:, but not from #collect: or #=.
Thanks,
--
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
https://github.com/jvuletich
https://www.linkedin.com/in/juan-vuletich-75611b3
@JuanVuletich
> On Mon, Sep 30, 2019 at 7:49 AM Juan Vuletich <juan at jvuletich.org
> <mailto:juan at jvuletich.org>> wrote:
>
>
> Oh, apologies. I thought those were harmless and didn't even
> comment about them. You can get by by removing #3889 and #3890
> until we understand and fix.
>
> The idea is to fix things like
>
> Color red select: [ :v | v > 0.5 ]
>
> This shouldn't answer an instance of Color, but of the closest
> superclass that can have instances of any size. The same happens
> for many other classes in optional packages. How is this affecting
> your code? I guess you have ArrayedCollection classes that answer
> a non-zero value to #numElements, but their #species should be the
> class, right? What would happen if a #select: answers a smaller
> instance? And more important, what else are we using #species for?
>
> Thanks,
>
> --
> Juan Vuletich
> www.cuis-smalltalk.org <http://www.cuis-smalltalk.org>
> https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
> https://github.com/jvuletich
> https://www.linkedin.com/in/juan-vuletich-75611b3
> @JuanVuletich
>
>
> On 9/30/2019 7:29 AM, Phil B wrote:
>> Juan,
>>
>> Could you explain the why behind the ArrayedCollection #species
>> change? I understand what you're doing, but not why... (rather
>> important since my subclasses are now breaking and I'm not
>> following the reasoning yet)
>>
>> Thanks,
>> Phil
>>
>> On Sun, Sep 29, 2019 at 1:57 PM Juan Vuletich via Cuis-dev
>> <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>> wrote:
>>
>> Hi Folks,
>>
>> After many requests made during a long time, it is finally
>> here. We can
>> now serialize almost any BlockClosures, including those that
>> use outer
>> temps, self, instance variables, etc.
>>
>> The only closures that can't be serialized are those that do
>> non-local
>> returns (^stuff) or super sends. These are usually not passed
>> around or
>> stored in variables, so I don't expect this to be a limitation.
>>
>> Updates now at GitHub.
>>
>> Cheers,
>>
>> --
>> Juan Vuletich
>> www.cuis-smalltalk.org <http://www.cuis-smalltalk.org>
>> https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
>> https://github.com/jvuletich
>> https://www.linkedin.com/in/juan-vuletich-75611b3
>> @JuanVuletich
>>
>> --
>> Cuis-dev mailing list
>> Cuis-dev at lists.cuis.st <mailto:Cuis-dev at lists.cuis.st>
>> https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20190930/fe8bb574/attachment.htm>
More information about the Cuis-dev
mailing list