binary selectors ambiguity and space
sr at evolgo.de
Mon May 15 21:31:02 UTC 2006
I've just digged into
NCITS J20 DRAFT December, 1997 33 of ANSI Smalltalk Standard revision
1.9; in short:
- 'White space is allowed between the '-' and the <number>' for a
numeric literal; and
- 'If a negative <number literal> follows a binary selector there must
intervening white space.'
So your example
>>> On 13.05.2006 02:10, nicolas cellier wrote: nc>... nc> Funny, in
>>> current 3.9 spaces are ignored: nc> i have '1 +- 2' interpreted
>>> as (1) + (-2)
is totally legal, but
should not be parsed as
(x) + (-1)
. I'm interpreting the standard in this case - at least I think it can
be interpreted this way (see below for the definition of binary
operators) - as to parse it as
(x) +- (1)
, +- being a binary selector.
We should follow the standard IMO, this means to allow
(here I have changed my mind after looking into it). In spite of this I
think it is not a good style to omit spaces here (and it gives a MNU
later, if +- is not defined)...
For points like
0 at -1
this could give the workaround of defining
as operator (and @+ , too) much sense, because after the standard 0 at -1
could be parsed as
(0) @- (1)
. Moreover a compile warning - 'Please insert spaces! This will be
parsed as ...; is this your intention?' or so - would make sense then
(since the extra message send here decreases performance).
Snippets from the standard draft:
> 184.108.40.206 Numeric Literals
> Numbers are objects that represent numerical values. Numeric literals are used to create numeric
> objects which have specific values and numeric representations.
> <number literal> ::= ['-'] <number>
> <number> ::= integer | float | scaledDecimal
> If the preceding '-' is not present the value of the numeric object is a positive number. If the '-' is
> present the value of the numeric object is the negative number that is the negation of the positive
> number defined by the <number> clause. White space is allowed between the '-' and the
> 3.5.5 Operators
> Three types of operator tokens are defined in Smalltalk: binary selectors, the return operator, and
> the assignment operator.
> binaryCharacter ::=
> '!' | '%' | '&'' | '*' | '+' | ','' | '/' | '<' | '=' | '>' | '?' | '@' | '\' | '~' | '|' | '-'
> binarySelector ::= binaryCharacter+
> returnOperator ::= '^'
> assignmentOperator ::= ':='
> Binary selectors are method selectors that appear similar to mathematical operators. A binary
> selector may be any length greater than or equal to one. If a negative <number literal> follows a
> binary selector there must intervening white space.
> An implementation may define additional binaryCharacters but their use may result in a non-
> portable program.
PS: Nice that you already have code for finding critical cases.
On 15.05.2006 22:27, nicolas cellier wrote:
Stephan Rudlof (sr at evolgo.de)
"Genius doesn't work on an assembly line basis.
You can't simply say, 'Today I will be brilliant.'"
-- Kirk, "The Ultimate Computer", stardate 4731.3
More information about the Squeak-dev