The ANSI standard has the following rules for blocks: <block constructor> ::= '[' <block body> ']' <block body> ::= [<block argument>* '|'] [<temporaries>] [<statements>]
The standard does not recognize [:x] as legal syntax for a block.
On Aug 18, 2019, at 3:03 PM, Levente Uzonyi <leves@caesar.elte.hu mailto:leves@caesar.elte.hu> wrote:
Hi Nicolas,
Thanks for investigating this. 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. Or does it work in other dialects with non-empty blocks? Is it used in other dialects?
Levente
On Sun, 18 Aug 2019, Nicolas Cellier wrote:
Le jeu. 15 août 2019 à 12:21, Levente Uzonyi <leves@caesar.elte.hu mailto:leves@caesar.elte.hu> a écrit : On Thu, 15 Aug 2019, Tobias Pape wrote:
> >> On 15.08.2019, at 03:29, Levente Uzonyi <leves@caesar.elte.hu <mailto:leves@caesar.elte.hu>> wrote: >> >> On Wed, 14 Aug 2019, commits@source.squeak.org <mailto:commits@source.squeak.org> wrote: >> >>> A new version of ShoutCore was added to project The Inbox: >>> http://source.squeak.org/inbox/ShoutCore-ct.69.mcz <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" ]! >>