[squeak-dev] The Inbox: ShoutCore-ct.69.mcz

Marcel Taeumel marcel.taeumel at hpi.de
Wed Aug 21 05:48:37 UTC 2019


-1 for supporting [:arg ]

+1 for promoting [:arg | "nothing" ]
+1 for supporting [ "nothing" ] using #cull:

Best,
Marcel
Am 19.08.2019 23:35:56 schrieb Levente Uzonyi <leves at caesar.elte.hu>:
On Mon, 19 Aug 2019, Nicolas Cellier wrote:

>
>
> Le lun. 19 août 2019 à 03:37, John Pfersich via Squeak-dev a écrit :
> The full definition from the draft standards (don’t have the standard handy) is:
> ::= '[' ']'
> ::= [* '|'] [] []
> ::= ':' identifier
>
> The last line is on the next page of the draft.
>
> /————————————————————/For encrypted mail use jgpfersich at protonmail.comGet a free account at ProtonMail.com
> Web: www.objectnets.net and www.objectnets.org
>
> On Aug 18, 2019, at 12:09, JOHN SARKELA via Squeak-dev wrote:
>
> The ANSI standard has the following rules for blocks:
>
> ::= '[' ']'
> ::= [* '|'] [] []
>
> The standard does not recognize [:x] as legal syntax for a block.
>
> Yes, same as blue book. (block temporaries apart, this did not exist in st-80), bar is mandatory.
> On Aug 18, 2019, at 3:03 PM, Levente Uzonyi wrote:
>
> Hi Nicolas,
>
> Thanks for investigating this.
>
> It's been a pretext for playing with historical material ;)
>
> I still think that it's just a parser bug, which is accidentally "used" sometimes, especially because it only works when the block is empty.
>
> Seeing the code, it's the & (hereType ~~ #rightBracket) condition following (t1 size > 0 which makes [:x ] syntax possible.
> Since it has been added explicitely, my bet is that it has been added purposely and deliberataly rather than accidentally.
>
> It seems [:x ] was not accepted in earlier version 00:
>
> [block | blk argNodes argument |
> " '[' {:var.} (:var|statements) ']' BlockNode"
> argNodes ← (Vector new: 1) asStream.
> (self match: #leftBracket)
> ifTrue:
> [[(self match: #colon) and: [((argument ← self match: #word)
> ifTrue: [argNodes next← encoder autoBind: argument]
> ifFalse: [↑self expected: 'Argument name'])]] whileTrueDo: [].
> (argNodes empty or: [(self match: #verticalBar)]) false
> ifTrue: [↑self expected: 'Vertical bar'].
> ((blk ← self statements: argNodes contents doit: false) and: [(self match: #rightBracket)])
> ifTrue: [↑blk].
> ↑self expected: 'Period or right bracket']
> ifFalse: [↑self expected: 'Left bracket']].
> http://xeroxalto.computerhistory.org/Indigo/BasicDisks/Smalltalk14.bfs!1_/.st80sources.v00.html
>
> Or does it work in other dialects with non-empty blocks?
>
>
> Nope, the syntax is only for empty blocks.
> It could have worked for any block if we wanted to, because that vertical bar is just a decoration in blocks.
> From disambiguation POV, it's absolutely unecessary, the block arguments are already delimited by colon prefix :x
> Symetrically, we don't use such delimitation between method pattern and statements... But it evolved across history:
>
> Historically, Smalltalk-76 did use a single (optional) bar for declaring temporaries (if any):
> methodDefnition := pattern [ '|' temporaries ] '[' statements ']'
>
> Then early Smalltalk-80 method definitions did use empty temps systematically '[' pattern '|' '|' statements ']'
> The two bars were mandatory at that time
>
> "374" LADParser$'Parser'
> [temporaries | vars |
> "[ '|' {variable} ] {variable, ..., variable}"
> (self match: #verticalBar) and: [((self match: #verticalBar)
> ifTrue: [↑#()].
> vars ← (Vector new: 8) asStream.
> [hereType #word] whileTrueDo: [vars next← encoder bind: self advance].
> (self match: #verticalBar)
> ifTrue: [↑vars contents])].
> ↑self expected: 'Vertical bar'].
> http://xeroxalto.computerhistory.org/Indigo/BasicDisks/Smalltalk14.bfs!1_/.st80sources.v00.html
>
> I guess that current block syntax is the legacy from all these syntax evolutions/experiments...
>
> Personnally, I like the bar, because it reminds me mathematical notation I learned at school for ensemble comprehension https://fr.wikipedia.org/wiki/Ensemble...
>
> {x ∊ E | x even }
>
> translated in Smalltalk:
>
> E select: [:x | x even].
>
> without bar, I'm really NOT used to it:
> E select: [:x x even].
>
>
> Is it used in other dialects?
>
> It is used in Squeak:
>
> Context>>runSimulated: aBlock
> "Simulate the execution of the argument, current. Answer the result it
> returns."
>
> ^ thisContext sender
> runSimulated: aBlock
> contextAtEachStep: [:ignored]
>
> "Context runSimulated: [Pen new defaultNib: 5; go: 100]"
>
> See also MCMcdReader>>#loadPatch MCPatch>>#initializeWithBase:target:

There are 24 uses in my image, one from an external package: Xtreams:

CurrentReadOnlySourceFiles cacheDuring: [
| regex |
regex := '\[\s*\:\s*\w+\s*\]' asRegex.
SystemNavigation default browseAllSelect: [ :method |
regex search: method getSource asString ] ]


>
> I also see two usages in VW, MethodContext>>#selector and BlockContext>>#selector.
> The fact that these two methods still have undescore (left arrow) assignment in source code and have same argument signature [:ignored] speaks for itself!!!
> I'm convinced that it's been an easy hack/feature originating in early 80s (probably by Dan Ingalls), and forgotten since, that never made it into the offical specifications.
> Smalltalk is malleable enough :)
>
> We can deprecate it if we want, but we will have to support backward compatibility in the Parser. The boring side of frozen specs...
> In this case,we'd better not support it in Shout.

Most users just ignore the argument of an error handler block this way,
but that's unnecessary in Squeak, because the block doesn't have to have
any arguments:

[ self error ] on: Error do: [ "nothing" ]

But some users can't omit the block argument so easily, so perhaps its
worth supporting this construct in Shout.

Levente

>
> Levente
>
> On Sun, 18 Aug 2019, Nicolas Cellier wrote:
>
> Le jeu. 15 août 2019 à 12:21, Levente Uzonyi a écrit :
> On Thu, 15 Aug 2019, Tobias Pape wrote:
>
> >
> >> On 15.08.2019, at 03:29, Levente Uzonyi wrote:
> >>
> >> On Wed, 14 Aug 2019, commits at source.squeak.org wrote:
> >>
> >>> A new version of ShoutCore was added to project The Inbox:
> >>> http://source.squeak.org/inbox/ShoutCore-ct.69.mcz
> >>>
> >>> ==================== Summary ====================
> >>>
> >>> Name: ShoutCore-ct.69
> >>> Author: ct
> >>> Time: 14 August 2019, 10:43:04.7164 pm
> >>> UUID: 7d165f4e-09bf-a445-a664-5e8edb9867b8
> >>> Ancestors: ShoutCore-ul.68
> >>>
> >>> Fix bug in SHParserST80: Wrong styling after blocks with arguments without statements
> >>
> >> If you mean that Shout should accept [ :x ], then no, I'm pretty sure that's not valid smalltalk syntax, even if Parser accepts it.
> >> The vertical bar, even though I consider it unnecessary in all cases, is mandatory when there are arguments.
> >
> > I only got to know this "shortcut syntax" because eliot used it either Cog or somewhere in trunk when preparing something (Spur? full block closures? I forgot). So this
> is a syntax idiosyncrasy that is in active use, not only "old code".
> >
> > Either we forbid it in the parser and change all of the image or allow it in Shout.
>
> Can you give me examples?
> I suspect those are just typos, which the parser accidentally accepted
> (and Shout as well before my fixes).
>
> Levente
> I don't remember seeing this syntax before and found it a bit surprising.
> So, for the sake of curiosity, I tried in some other dialects.
> [:x ] is accepted syntax in
> - Visualworks (8.3),
> - Pharo (v7 with OpalCompiler)
> - Smalltalk-80 (apple v0.?)
> [:x ] is invalid in
> - Dolphin
> - Smalltalk/X (jv branch)
> So it seems that it's something originating from original Smalltalk-80, but not reproducted in non derivated dialects...
> The bar is mandatory in blue book specification (see the last pages)
> Capture d’écran 2019-08-18 à 17.11.53.png
> So it seems that implementation did not agree with specifications for ages...
> Capture d’écran 2019-08-18 à 18.56.05.png
>
> >
> > Best regards
> > -Tobias
> >
> >>
> >> Levente
> >>
> >>>
> >>> Thanks Jakob for the report!
> >>>
> >>> =============== Diff against ShoutCore-ul.68 ===============
> >>>
> >>> Item was changed:
> >>> ----- Method: SHParserST80>>parseBlockArguments (in category 'parse') -----
> >>> parseBlockArguments
> >>>
> >>> currentTokenFirst == $: ifFalse: [ ^self ].
> >>> [ currentTokenFirst == $: ] whileTrue: [
> >>> self
> >>> scanPast: #blockArgColon;
> >>> parseArgument: #blockPatternArg ].
> >>> + ((self parseVerticalBarForTemporaries: #blockArgsBar) and: [
> >>> + currentTokenFirst ~= $] ])
> >>> + ifFalse: [
> >>> + self fail ": Missing block args bar" ]!
> >>> - (self parseVerticalBarForTemporaries: #blockArgsBar) ifFalse: [
> >>> - self fail ": Missing block args bar" ]!
> >>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20190821/70973f4c/attachment-0001.html>


More information about the Squeak-dev mailing list