Re: Another Error

new topic     » goto parent     » topic index » view thread      » older message » newer message

Rich Klender wrote:
> 
> Well, I hit another snag, if anyone would be gracious enough to help!!!
> 
> Here's the code:

I've reduced it to the problem area ... 

>     sequence Correct
>     if Correct = 'y' or Correct = 'Y' then
 
> true/false condition must be an ATOM 

This has been one of my few disappointments with Euphoria. Robert Craig, the
creator of the language, has defined the 'if' statement in a manner which most
other languages do not. Bear with me please, as I understand that this is your
first real programming effort - I may get a little technical here blink

Euphoria defines the IF statement as 

   IF ::  'if' ATOMEXPRESSION 'then' 
            [ STATEMENTBLOCK ] 
            [ ELSEPHRASE ] 
          'end if'

but most other languages define it as 

   IF ::  'if' COMPARISIONEXPRESSION 'then' 
            [ STATEMENTBLOCK ] 
            [ ELSEPHRASE ] 
          'end if'

The difference is that Euphoria evaluates the expression that follows the 'if'
keyword in a manner that is not expected by nearly everyone else except Robert.
Taking your example code, this is what happens...

  if Correct = 'y' or Correct = 'Y' then

Let's assume that the user entered "Y" into the variable Correct. Euphoria will
first evaluate

     "Y" = 'y'

which is a sequence operation, meaning for each element in the sequence it will
apply the  " = 'y' " fragment. Remember that strings are sequences so the value
in Correct is equivalent to

  {'Y'}

so the result of this first sequence operation is 
  {'Y'} = 'y'   ===>  {0}
because the operation compares each element in Correct with 'y' and replaces the
result with either 1 or 0 depending on the comparision result. 1 means true and 0
means false.

The second sequence operation is 

   Correct = 'Y'

which is the same as 

   {'Y'} = 'Y'

which results in {1}

The final sequence operation is then
   {0} or {1}
which results in {1}

The net result of this is that your IF statement is equivalent to 

   if {1} then

but this is wrong as Euphoria requires the expression to result in an atom value
and not a sequence. This is why Euphoria doesn't like things like

  if "yes" then

But back to most other languages...

  if Correct = 'y' or Correct = 'Y' then

they would evaluate the expression as a comparision instead.

   Correct = 'y'  ===> false
   Correct = 'Y'  ===> true
   false or true  ===> true

and thus your statement is equivalent to

   if true then

which makes a lot more common sense than Robert's concept of an IF statement.


However, as Robert's philosophy on this is never going to change, the only safe
way to code equality tests in IF statements in Euphoria is this ...

  if equal(Correct, 'y') or equal(Correct, 'Y') then

which is not an intuitive alternative.

-- 
Derek Parnell
Melbourne, Australia
Skype name: derek.j.parnell

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu