Re: Another Error

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

Derek Parnell wrote:
> 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. 

Which languages are you including in your list of 
"most other languages"? I know Basic works the way you would like, 
but C/C++ (a more popular language) does not. People who come to 
Euphoria from a Basic background are often confused by this, 
but many other people, such as myself, who are used to C/C++, 
think it's fine to require a function call to compare strings or 
arrays in this way. This is not something that Robert Craig invented, 
all on his own, just to annoy the rest of the world. 

> 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, 

Yeah, I guess I'm just a stubborn old fool. smile

> 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.

I assume you meant:

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

Anyway, thanks for the tutorial. I know there are newbies
who are confused by this feature.

For what it's worth, I'd probably code it as:

   if find('Y', upper(Correct)) then ...

which will allow the user to type any of:
 Y
 y  
 yes
 Yes
 YES 
 yeah
etc.

rather than insisting that he type precisely "y" or "Y"
(with no extra characters, leading or trailing blanks etc.).

Or perhaps something like:

   if find(upper(Correct), {"Y", "YES", "OK", "OUI", "JA", "SI"}) then  

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

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

Search



Quick Links

User menu

Not signed in.

Misc Menu