I just randomly ran into this project https://github.com/ba-st/aconcagua which seems to be designed around such unary selectors.
On Sat, Nov 18, 2017 at 12:55 AM, Benoit St-Jean via Pharo-dev < pharo-dev@lists.pharo.org> wrote: > > > ---------- Forwarded message ---------- > From: Benoit St-Jean <bstj...@yahoo.com> > To: Pharo Development List <pharo-dev@lists.pharo.org> > Cc: > Bcc: > Date: Fri, 17 Nov 2017 23:55:56 +0000 (UTC) > Subject: Re: [Pharo-dev] Pharo and special unary selectors > Personnally, I against adding those special symbols. They add close to > nothing (except complexity in the parser) to what we can actually do! > > Besides, what does 30$ + 17$ add up to? Oh! Did I tell you it was > actually $30USD + $17CAN ? :) > > > ----------------- > Benoît St-Jean > Yahoo! Messenger: bstjean > Twitter: @BenLeChialeux > Pinterest: benoitstjean > Instagram: Chef_Benito > IRC: lamneth > Blogue: endormitoire.wordpress.com > "A standpoint is an intellectual horizon of radius zero". (A. Einstein) > > > On Friday, November 17, 2017, 6:41:11 PM EST, Ben Coman < > b...@openinworld.com> wrote: > > > If a valid Smalltalk method identifier contains only... > [a-zA-Z][a-zA-Z0-9]* > http://www.osdata.com/programming/firstprograms/valididentifiers.html > > then one option could be that unary symbols must touch the previous > identifier, i.e. no intervening whitespace, > > 100% > 20$ > 40€ > 12‰ > portion% > someMoney$ > > > or pick a new "unary separator/binder" > > 100'% or 100 '% > 20'$ or 20 '$ > 40'€ or 40 '€ > 12'‰ or 12 '‰ > portion'% > someMoney'$ > > > or re-use the existing colon which indicates an argument to the right, > to indicate an argument to the left.... > > 100 :% > 20 :$ > 40 :€ > 12 :‰ (for promille) > portion :% > someMoney :$ > > which is unambiguous regarding block variable definitions since no > messages are valid in the block variable definition area, > but this may complicate precedence semantics due to its similarity to a > keyword selector, > and would complicate things if the space was missing. > > > > On 18 November 2017 at 04:02, Nicolas Cellier <nicolas.cellier.aka.nice@ > gmail.com> wrote: > > > > 2017-11-17 18:32 GMT+01:00 Thierry Goubier <thierry.goub...@gmail.com>: > > Le 17/11/2017 à 10:14, Nicolas Cellier a écrit : > > > > 2017-11-17 17:40 GMT+01:00 Gabriel Cotelli <g.cote...@gmail.com <mailto: > g.cote...@gmail.com>>: > > I would really like to see % removed as a binary selector and > available to use in unary or keyword ones. The only implementor in a > Pharo 6 image is: > > % aNumber > > ^ self \\ aNumber > > > +1, such alias has nothing to do in Kernel > > So it's juts aliasing \\ , and % most widespread usage in the real > world is por percentages (the use in modular arithmetic is more a > programming thing that math notation I think). > > And for allowing more Unicode code points for selector names I'm > totally in for Symbols, Arrows, Math Symbols, etc... We just need to > analyse the ones that makes sense as binary selectors, and the ones > allowed for unary and keyword ones. This will allow us to write > pretty cool DSLs. > > Just my opinion. > > This could also be the case for punctuation like ! and ? > > The idea of Torsten is more generic, any combination of binary char could > be used. > From what I understand from https://en.wikipedia.org/wiki/ LR_parser > <https://en.wikipedia.org/wiki/LR_parser> we would just have to scan one > more token ahead for deciding if unary or binary, and could preserve our > simple shift reduce steps... > > > The Smalltalk parsers being handwritten, there wouldn't be shift/reduces > to contend with, and, anyway, the lexer doesn't shift/reduce; it would > simply creates a token up to the next separator (that is goble up the next > space/cr/end of line dot/closing parenthesis/etc...) > > > I don't have academical cursus, so I may be approximate, but the manually > written parsers just have to read a single token ahead so far, and linearly > build the parseNode, to me it was equivalent. > > > So it seems doable for resolving the send. > > > Sort of. The parser difficulty would be this one: > > anObject % print > > > Yes, that's a severe limitation. Context free => it's a binary... Or we > have to use ( ). > But then it's unfriendly to have different rules for unary symbols versus > unary words... > It devaluates the idea... > > > > Is this a binary selector with a print argument or two unary selectors? > > > Less ambiguous... > anObject'% print > anObject '% print > > > > > Using the symbol table when you parse would solve it, but that is > certainly not context free... > > More problematic would be the declaration of method, if we have both a > unary + and a binary +, we will need new syntax for marking the difference. > > > > In most cases, distinguishing between unary + declaration and binary + > declaration would be doable: > > + whatever > > is the start of a binary selector > > + ^ self > > is the start (or the declaration of) an unary selector. > > But writing > > + self > > Can be interpreted as either unary plus doing self, or binary + method > definition... > > > a "unary binder" could distinguish them... > > binary method definition... > + self > > unary method definition... > '+ self > > > > issues... > > + b | c | > > a binary plus with unused temp and implicit ^self, or unary + with binary > | sent to b with unary (c |) parameter etc... > > > + b | c | > binary plus, unused temporary c > > '+ b | c | > unary plus, first | is binary, second | is unary > or maybe it would need to be... '+ b | c'| > > > > So we need a new syntax meaning that there is no parameter, like + ][ or > anything yet unused... > > > without ' > > + || b | c | > empty local variable definition, next | is binary, second | is unary > > also with local variable... > + | lv1 | b | c | > + | lv1 | b | c'| > > > > > > > Whether it's worth or not is another matter... > > > Well, one should probably try to implement the various parsers for that > (extend RB, extend the SmaCC Smalltalk parser, extend the Petit Parser) to > see how much complexity it would bring. > > Coming up with strange interpretations one could do with that syntax can > be helpfull as well. > > Regards, > > Thierry > > On Fri, Nov 17, 2017 at 6:32 AM, Torsten Bergmann <asta...@gmx.de > <mailto:asta...@gmx.de>> wrote: > > Hi, > > just something to think about: one thing I always liked about > Smalltalk is that it allows for nice DSL's. We have nice things > like a unit framework in Pharo, ... > > In the most simple case one can easily implement own units just > by providing a unary messages: > > 1 m > 1 second > 1 px > 1 EUR > > One can easily implement an own Money class with a currency and > then do polymorphic tricks like > > 10 EUR + 20 EUR > > > btw, did the recently announced QA Release Tests add enforcement all > selectors to start with a lowercase? > I felt that one a bit overly-restrictive, which would break such a > currency DSL. > > cheers -ben > > > > But we can currently can not implement special unary selectors > (including special unary selectors with unicode) like: > > 100 % > 20 $ > 40 € > 12 ‰ (for promille) > > Especially things like 20 % would be nice for layout issues or > other (Bloc comes to mind). > > Maybe we should put that on the roadmap of Pharo because IMHO it > would be cool to support such things in the > future. Dont know how much effort it currently means on the > technical level but maybe others can comment. > > Thx > T. > > > >