[Cuis-dev] How to use Events?

Juan Vuletich juan at jvuletich.org
Tue Sep 10 03:59:21 PDT 2019


Some time ago, Phil didn't like (neither do I) that we say stuff like 'a 
:= 2 at 3', 'a := Float pi', or 'a := { blah. blah. blah}', we are calling 
instance creation methods all the time, and allocating new objects that 
won't be modified. But not when we do 'a := 7.0' or 'a := #(1 2 3)', 
because in these cases the objects are created at compile time. I came 
up with the backtick idea and implemented it in Cuis. It is a rather 
nice addition, other Smalltalks could follow.

For Philip, (and weak references in general) making these 'literals' 
true literals means that the CompiledMethod will hold a strong reference 
to them, so they won't vanish when needed.

Someway related to this is that all that literal objects should be 
immutable. This was not done yet, but we'd do it some day.

Cheers,

-- 
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 9/9/2019 10:43 PM, Casey Ransberger via Cuis-dev wrote:
> Hey Juan, is the backticks thing specific to Cuis, or is this yet another magic feature of Smalltalk that I didn’t know about?
>
> —Casey
>
>> On Sep 9, 2019, at 6:04 AM, Juan Vuletich via Cuis-dev<cuis-dev at lists.cuis.st>  wrote:
>>
>>> On 9/9/2019 3:17 AM, Philip Bernhart via Cuis-dev wrote:
>>> Hello,
>>>
>>> I noticed that when I register events with when:send:to:with: with collections
>>> as the with: paramater the contents of the collection the collection
>>> becomes nil on the actually triggered event. Maybe that has something
>>> todo with WeakMessageSend. Anyway an example tells better what I mean:
>>>
>>>
>>> browserMorph
>>>     setProperty: #editItemAction
>>>     toValue: [:repository :record|
>>>         | flashcardMorph card mapping |
>>>         flashcardMorph _ FlashcardMorph new.
>>>         card _ Flashcard new.
>>>         card question: (record at: #question ifAbsent: '').
>>>         card answer: (record at: #answer ifAbsent: '').
>>>
>>>         card when: #changed
>>>              send: #saveRecordMappingWith:
>>>              to: browser
>>>              with: {card. record}.
>>>
>>>         flashcardMorph model: card.
>>>         flashcardMorph showAnswer.
>>>         flashcardMorph enableEditing.
>>>         flashcardMorph openInWorld ].
>>>
>>> Then in Flashcard there is a foo method which does:
>>> self triggerEvent: #changed.
>>>
>>> Here the {card. record} becomes for some reason (weak reference?) nil
>>> and causes that the event isn't triggered. So #saveRecordMappingWith:
>>> isn't called.
>>>
>>> With simple datatypes like Integers this works, with static arrays this
>>> seems to work too.
>>>
>>> Maybe this style of doing that isn't the right one, maybe I'm using the
>>> event system for things which it wasn't supposed to do.
>>>
>>> Suggestions?
>>>
>>>
>>> Thanks for your time,
>>> Philip
>> Hi Philip,
>>
>> I believe the event system uses WeakMessageSend in all Smalltalk dialects. Folks, please correct me if I'm wrong.
>>
>> An easy way to fix the problem is to turn your collection into a literal, using backticks:
>>
>>         card when: #changed
>>              send: #saveRecordMappingWith:
>>              to: browser
>>              with: `{card. record}`.
>>
>>
>> Cheers,
>>
>> -- 
>> 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
>>
>> -- 
>> Cuis-dev mailing list
>> Cuis-dev at lists.cuis.st
>> https://lists.cuis.st/mailman/listinfo/cuis-dev



More information about the Cuis-dev mailing list