[Cuis-dev] unnecessary punctuation

Andres Valloud ten at smallinteger.com
Wed Jun 12 17:04:03 PDT 2024


Yeah, same reason why or: / and: are faster than | and &.

On 6/12/24 3:32 PM, Jaromir Matas via Cuis-dev wrote:
> 
> 
> 
> On 12-Jun-24 11:32:59 PM, "Mark Volkmann via Cuis-dev" 
> <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>> wrote:
> 
>> On Wed, Jun 12, 2024 at 4:28 PM Vanessa Freudenberg 
>> <vanessa at codefrau.net <mailto:vanessa at codefrau.net>> wrote:
>>
>>     On Wed, Jun 12, 2024 at 6:56 AM Mark Volkmann via Cuis-dev
>>     <cuis-dev at lists.cuis.st <mailto:cuis-dev at lists.cuis.st>> wrote:
>>
>>         I saw this example in a YouTube video about Smalltalk this
>>         morning:
>>
>>         (2 > 3) ifTrue: ['Yes'] ifFalse: ['No']
>>
>>         It seems to me that none of the parentheses or square brackets
>>         are needed here.
>>         The following works the same for me.
>>
>>         2 > 3 ifTrue: 'Yes' ifFalse: 'No'
>>
>>         Is it true that keyword messages that take no-arg blocks can
>>         always take a literal value instead?
>>         It seems this works because the `Object` class defines the
>>         `value` method to just return `self`.
>>
>>
>>     Yes it only works because of Object>>value.
>>
>>
>> I assumed that was intentional to support using objects that are not 
>> blocks in cases like this.
>>
>>     It's also twice as slow to leave out the block brackets because it
>>     prevents compiler optimizations and forces actual sends to be
>>     made. You can verify that by benchmarking, and understand it by
>>     looking at the bytecodes generated and running a message tally.
>>
>>
>> I believe you, but I'm curious why it's faster to send the `value:` 
>> message to a block than to some other kind of object. Are you saying 
>> that the optimizations make it so the `value:` message is not actually 
>> sent to a block in this case and code in the block gets inlined?
>>
>  >> It's also twice as slow to leave out the block bracket [...]
> 
> Interesting - I've never realized the difference :) So if I understand 
> correctly the #ifTrue:ifFalse message gets inlined only when used with 
> block arguments, and it gets really sent when used without blocks; which 
> means not only there's one more send but also that **both** 'Yes' and 
> 'No' expressions get evaluated before sending #ifTrue:ifFalse (hence 
> twice as slow?). Inlining allows the runtime to evaluate only the 
> "right" alternative. Here's the bytecode:
> 
> 2 > 3 ifTrue: 'Yes' ifFalse: 'No'
> 
> 49 pushConstant: 2
> 51 pushConstant: 3
> 53 send: >
> 54 pushConstant: 'Yes'
> 55 pushConstant: 'No'
> 56 send: ifTrue:ifFalse:
> 57 returnTop
> 
> 
> (2 > 3) ifTrue: ['Yes'] ifFalse: ['No']
> 
> 49 pushConstant: 2
> 51 pushConstant: 3
> 53 send: >
> 54 jumpFalse: 57
> 55 pushConstant: 'Yes'
> 56 jumpTo: 58
> 57 pushConstant: 'No'
> 58 returnTop
> 
> Thanks,
> Jaromir
> 
> 
> 
> 
> 
> 
>>
> 


More information about the Cuis-dev mailing list