[Gambas-user] Ambiguous expression?
Doriano Blengino
doriano.blengino at ...1909...
Wed Mar 10 20:20:19 CET 2010
Benoît Minisini ha scritto:
>> Alessandro Rinaldi ha scritto:
>>
>>> I really think yes.
>>> Standard symbol for fractions is /, why should you use \?
>>>
>> Backslash is "integer division", and should yeld an integer result.
>> Slash is "float" division, and yelds a float number (this is "Basic"
>> syntax; other languages use different methods).
>>
>> The expression "1\2*3" is not really ambiguous, it is only for Gambas
>> (don't ask me why); it should be seen as "take an integer number,
>> integer-divide it for another integer number, and multiply the result
>> for another integer number, giving an integer result".
>>
>>
> I noticed that operator evaluation order differ between languages, even if
> they agree on most parts.
>
> So I decided to raise an error when the compiler encounters different
> operators having the same evaluation order weight, and when I thought that the
> interpreter may not do what the user thinks.
>
> By compelling the user to add brackets, I make the source code less ambiguous
> for another reader, so this is a good thing.
>
> But the test is not perfect, and I don't remember why I do not raise the error
> for 1/2*3 and I raise it for 1\2*3.
>
> Maybe because that mixing "*" and "/" is usual in mathematics, but mixing an
> integer division with a normal multiplication not, and I wanted to force the
> use of brackets.
>
Perhaps this is because C has "/" and "*", and both have a double
meaning (integer and float);
pascal has two separated "/" and "DIV", and only one "*". So gambas is
similar to pascal.
When an operator is the same on different types (integer and floats),
the compiler checks the arguments of the operator to decide whether
promote one of the two (and the result).
In this very case, all the arguments are integer, so all the operators
are integer too, and there should be no doubt.
Anyway, division and multiplication have the same precedence and
(probably?) same associativity.
But I agree with you: by combining precedence and associativity it is
easy to make up a mess, and sometimes a solution like yours is better.
The C language has something like 15 or more rules, so who remembers the
exact result of "*pointer-- >> 3+1"?
> Morever, that error is actually just a warning. I can suppress it, and Gambas
> will just apply its operator evaluation order without telling anything. But I
> don't think I will do it!
>
>
Uhm... *it is* an error if the compiler refuses to compile... it would
be possible to turn it in a warning (does gambas have warnings?), if
only one is very sure about promoting. But gambas uses a typing scheme
different from C and pascal, and automatic type conversions, so you are
probably right in keeping your way.
Regards,
Doriano
More information about the User
mailing list