[squeak-dev] Merge Request: #caseOf:otherwise: with arguments

Marcel Taeumel marcel.taeumel at hpi.de
Mon Nov 22 16:37:38 UTC 2021


Hi Christoph --

> Do I understand correctly that you do not yet consider this good enough? :)


That depends on your original motivation. :-) If you want to closure a binding from an outer context, there is no need for this inline optimization in the first place.

Having a one-arg block in "otherwise:" only makes sense for dynamic block re-use:

explorer := [:obj | obj explore].
...
a caseOf: cases otherwise: explorer.
...

Why would I want to rename an existing binding in the static case?

a := 42.
a caseOf: cases otherwise: [a explore]. "Why [:x | x explore]?"
...

Best,
Marcel
Am 22.11.2021 17:18:57 schrieb christoph.thiede at student.hpi.uni-potsdam.de <christoph.thiede at student.hpi.uni-potsdam.de>:
Hi Levente, Hi Marcel,

currently, this expression:

    self assert: 42 equals: (6 caseOf: { [a] -> [b]. [b] -> [c]. [c] -> [a] } otherwise: [:x | x * 7]).

is decompiled like that:

    self
        assert: 42
        equals: ((x := 6) caseOf: {
                [a] -> [b].
                [b] -> [c].
                [c] -> [a]}
                 otherwise: [x * 7])

x is also declared correctly in the test method. Do I understand correctly that you do not yet consider this good enough? :)

Best,
Christoph

---
Sent from Squeak Inbox Talk [https://github.com/hpi-swa-lab/squeak-inbox-talk]

On 2021-11-18T14:04:16+01:00, marcel.taeumel at hpi.de wrote:

> Hi Levente --
>
> Thanks. Decompiler only adds the block-arg for not-inlined caseOfs. See ObjectTest >> #testCaseOfOtherwise.
>
> Hmm... Christoph? =) Otherwise (ha!) I will take a look at it soon-ish.
>
> Best,
> Marcel
> Am 18.11.2021 13:51:02 schrieb Levente Uzonyi <leves at caesar.elte.hu>:
> Hi Marcel,
>
> I just checked how this works, and noticed that the decompiler cannot
> recreate the original code if the otherwise: block has an argument.
>
>
> Levente
>
> On Thu, 18 Nov 2021, Marcel Taeumel wrote:
>
> > Merged.
> >
> > Am 21.02.2020 17:33:03 schrieb Thiede, Christoph :
> >
> > This changeset makes it possible to accept an argument in the otherwise block of a #caseOf:otherwise: call.
> >
> >
> > Diff of the #caseOf:otherwise: implementation:
> >
> > caseOf: aBlockAssociationCollection otherwise: aBlock
> >
> > "The elements of aBlockAssociationCollection are associations between blocks.  Answer the evaluated value of the first association in aBlockAssociationCollection whose evaluated key equals the receiver.  If no
> > match is found, answer the result of evaluating aBlock."
> >
> >
> > aBlockAssociationCollection associationsDo:
> >
> > [:assoc | (assoc key value = self) ifTrue: [^assoc value value]].
> >
> > - ^ aBlock value
> >
> > + ^ aBlock cull: self
> >
> >
> > "| z | z := {[#a]->[1+1]. ['b' asSymbol]->[2+2]. [#c]->[3+3]}. #b caseOf: z otherwise: [0]"
> >
> > "| z | z := {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]}. #b caseOf: z otherwise: [0]"
> >
> > "The following are compiled in-line:"
> >
> > "#b caseOf: {[#a]->[1+1]. ['b' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [0]"
> >
> > "#b caseOf: {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [0]"
> >
> > + "#b caseOf: {[#a]->[1+1]. ['d' asSymbol]->[2+2]. [#c]->[3+3]} otherwise: [:x | x halt]"
> >
> >
> > Furthermore, the changeset includes a necessary modification of MessageNode >> #transformCase: so that the otherwise argument can be compiled in-line.
> >
> > Last but not least, I wrote some tests for #caseOf:[otherwise:].
> >
> >
> > Please review!
> >
> > (In a later change, it would be possible to allow arguments for the association key blocks as well. But I love short feedback loops, so let's assess this one first :-))
> >
> >
> > Best,
> >
> > Christoph
> >
> >
> >
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20211118/e87b1cbc/attachment.html>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20211122/be29625e/attachment.html>


More information about the Squeak-dev mailing list