[Cuis-dev] extending the syntax for blocks and methods

Francisco Garau francisco.garau at gmail.com
Fri Jul 15 11:38:53 PDT 2022


Hola Amigos -- just wanted to share with you some ideas I've been
thinking about for a while.

It all started when someone mentioned the colon in the syntax for block
arguments could have whitespace around the argument so that you could
write  [ : n | n + 1]

It makes perfect sense to see the block as an "inlined" method that doesn't
require any method-lookup; therefore, the selector is superfluous. But if
we accepted the selector inside the block, it could be used as the variable
holding the block. So, instead of writing succ := [:n | n + 1]  we could
write  [succ: n | n + 1]

Even better if the block evaluation accepts #: as a valid selector.  So you
could write (succ: 3) = 4 instead of (succ value: 3) = 4.

A short example will make this clear.

Vanilla Smalltalk

succ := [:n | n + 1].

(succ value: 3) = 4.


Extended Block Syntax

[succ: n | n + 1].

(succ: 3 ) = 4.

"the above is equivalent to"

(succ perform: #: with: 3) = 4.


Being able to parse blocks with these syntax paves the way to unify the
syntax for method definition—for example, a few hypothetical methods from
the Point class.

"Point class>x:y:"

[x: xInteger y: yInteger |

   ^self basicNew setX: xInteger setY: yInteger].


"Point>>abs"

[abs |

   ^x abs @ y abs].


"Point>>extent:"

[extent: aPoint |

   ^Rectangle origin: self extent: aPoint]


Of course, it gets trickier when blocks have more than one argument..

[add: a to: b | a + b].

(add_to value: 3 value: 4) = 7. "old style block evaluation"

(add: 3 to: 4) = 7.

I think building a separate Parser is a sensible approach -- is there a
Smalltalk Parser as a separate package that can be tweaked without
affecting the running image?

Thanks,
Francisco
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20220715/bea2e6da/attachment.htm>


More information about the Cuis-dev mailing list