[Gambas-user] Doesn't IF NOT exist? Bug or feature? Or my bad logic?
Doriano Blengino
doriano.blengino at ...1909...
Fri Sep 18 09:38:55 CEST 2009
Benoît Minisini ha scritto:
>> Rolf-Werner Eilert wrote:
>>
>>> Just stumbled over this when trying to implement a small copying
>>> function:
>>>
>>> FOR EACH datei IN Dir(opfad, odatei & ".*")
>>> IF NOT file.Ext(opfad &/ datei) = "lock" THEN
>>> COPY opfad &/ datei TO ziel &/ datei
>>> SELECT CASE file.Ext(ziel &/ datei)
>>> CASE "fehl", "feldbak", "felder", "notizen"
>>> SHELL "chgrp kartei " & ziel &/ datei WAIT
>>> SHELL "chmod 660 " & ziel &/ datei WAIT
>>> CASE "konto", "kontobak", "ktx", "ktxbak"
>>> SHELL "chgrp konto " & ziel &/ datei WAIT
>>> SHELL "chmod 660 " & ziel &/ datei WAIT
>>> END SELECT
>>> END IF
>>> NEXT
>>>
>>> IF NOT ... = ... THEN
>>>
>>> wouldn't copy anything, although only one file has the given extension.
>>> When I change this line into
>>>
>>> IF file.Ext(opfad &/ datei) <> "lock" THEN
>>>
>>> everything runs as expected. Doesn't make sense to me as both ways
>>> should mean the same in my understanding of logical NOT (which doesn't
>>> mean too much... :-) )
>>>
>>> Regards
>>>
>>> Rolf
>>>
>> From the docs, NOT is an operator that makes a boolean it's opposite
>> (TRUE turns to FALSE and vice versa) and will also invert each bit in an
>> integer. NOT(11) = -12 because that's what you get when you change
>> every bit from on to off and vice versa.
>>
>> From other examples in the docs, if you NOT a string with something in
>> it, you will get FALSE. However, if you NOT an empty string, you will
>> get TRUE.
>>
>>
>
> In other words, try to use brackets: IF NOT (...) = ... THEN
>
There is some wrong things in here, I think.
First, the operator NOT applied to a string is a little strange. It can
be handy for testing whether the string is empty or not, but doing so
it's ambiguous - it could be better to write:
if astring <> "" then...
Anyway, the result of such operation (NOT astring) would be a boolean.
Now, comparing a boolean value to a string should give a syntax error.
But go a step further. Your affirmation "try to use brackets" does not
work, at least in principle, because he wants to test the contents of
the first string against another string. By applying NOT only to the
first argument, the contents of the first string is lost. The
parenthesis should be put around the whole test: NOT (astring = "xxx") THEN.
I would prefer the NOT operator be incompatible with strings and, doing
so, the expression
NOT astring = "xxx"
could not be interpreted like "negate astring and go ahead" but instead
as "compare astring, and then negate" (if the parser can take such
decisions). Other languages, notably C, use different operators for
different results (! vs ~, && vs &...). More evoluted languages can
determine from the context the exact meaning of several operators. But
the gambas current way is the more ambiguous of all...
Regards,
Doriano.
More information about the User
mailing list