[squeak-dev] correct form for Problem With Blocks
Levente Uzonyi
leves at caesar.elte.hu
Thu Feb 11 19:29:38 UTC 2021
Hi Tim,
On Thu, 11 Feb 2021, gettimothy via Squeak-dev wrote:
> Hi Folks,
>
> I am importing my grammar/xtreams parsing work into its own image so that I can change my system fonts without making my other projects look funky with the chages.
>
> The base image is:
>
>
> Image
> -----
> /home/wm/usr/src/smalltalk/squeak6.0alpha/shared/Squeak6.0alpha-19802-64bit.image
> Squeak6.0alpha
> latest update: #20147
>
> to the latest:
>
> /home/wm/Squeak/images/WikitextParser/WikitextParser.image
> Squeak6.0alpha
> latest update: #20188
>
> During the import of my work, I ran into this issue regarding Store Into in a block:
>
>
> http://forum.world.st/Cuis-problem-with-blocks-td1047783.html#a1049556
>
>
> The parser is looking for patterns of (10e2)e2....i.e. exponential notation of unknown length, i.e. per the comment on Collection inject: into: accumulate a running value...
>
>
>
> Per the email chain referenced, the "Allow block argument assignment" is allowed in the former, and not allowed in the latest, which is cool with me, but...
>
> My question is "what is the generic form" that I can use to duplicate the behaviour I want?
> Here is the original method with the bad store into:
> Float: first exponent: pairs
> <action: 'Float' arguments:#(1 2)>
>
> "Float <- ( Number / Group / Function ) (''e'' ( Number / Group / Function ))+"
>
> |result|
> result := pairs inject: first
> into: [ :base :pair |
> (pair first = 'e')
> ifTrue: [
> (pair last abs > 1)
> ifTrue:[ base := Float readFrom: ((base asString) , 'e', (pair last asString))]
> ifFalse:[ base := (base * (10 raisedTo:(pair last) ))]]].
That makes no sense. I can't even fathom how it works.
#inject:into:'s second argument, the block, must return the computed
value.
Currently that block returns the value assigned to base when pair first =
'e' and nil otherwise.
So, if it works correctly now, which is doubtful, then just remove the
assignments to base from the block and it should just work.
>
> transcripton ifTrue:[Transcript show:'Float ' , (result asFloat); cr. ].
>
>
> ^ result asFloat
>
>
>
>
> Here is my "hack" to fix it , (I create a tmp variable outside the block to use in place of the "base"):
>
>
> Float: first exponent: pairs
> <action: 'Float' arguments:#(1 2)>
>
> "Float <- ( Number / Group / Function ) (''e'' ( Number / Group / Function ))+"
>
> |result tmp|
> result := pairs inject: first
> into: [ :base :pair |
> (pair first = 'e')
> ifTrue: [
> (pair last abs > 1)
> ifTrue:[tmp := base.
> tmp := Float readFrom: ((tmp asString) , 'e', (pair last asString))]
> tmp := Float readFrom: ((tmp asString) , 'e', (pair last asString)).
> tmp]
> ifFalse:[tmp := base.
> tmp := (tmp * (10 raisedTo:(pair last) ))]]].
> tmp := (tmp * (10 raisedTo:(pair last) )).
> tmp]]].
Those parentheses don't look well balanced, but anyway, there's no need
to use tmp, especially not one at the outer scope.
Levente
>
> transcripton ifTrue:[Transcript show:'Float ' , (result asFloat); cr. ].
>
>
> ^ result asFloat
>
>
> I got a bad feeling about this one.
>
>
> Is there a general form for this ?
>
>
> My brain is a bit foggy from working the graveyard shift so what would be obvious while in normal conditions , is not obvious today.
>
>
> Thanks for you time.
>
>
>
>
>
More information about the Squeak-dev
mailing list
|