1. evaluation of if statement

I can't seem to get the following code to work.  Should this work like
I expect it to, or does it need to be rewritten?

Ideally, given a sequence of {1,2,3} it should evaluate false, but
given {'b',2,3}, or {'b','B','b'} it should process true when
"position" corresponds to the position of the letter in the sequence.
But it always processes as false, even when the sequence element
has an ascii value between 'Z' and 'A'.

for position = 1 to length(input) do
    if 'Z' >= upper(input[position]) >= 'A' then
       found = find(upper(input[position]), upper(mapping))
    else
       found = find(input[position], mapping)
    end if
end for

am i missing something simple here?

James Powell
tired and confused at this point

new topic     » topic index » view message » categorize

2. Re: evaluation of if statement

At 06:10 PM 17/03/2002 -0800, I wrote:
>I can't seem to get the following code to work.  Should this work like
>I expect it to, or does it need to be rewritten?
>
>Ideally, given a sequence of {1,2,3} it should evaluate false, but
>given {'b',2,3}, or {'b','B','b'} it should process true when
>"position" corresponds to the position of the letter in the sequence.
>But it always processes as false, even when the sequence element
>has an ascii value between 'Z' and 'A'.
>
>for position = 1 to length(input) do
>    if 'Z' >= upper(input[position]) >= 'A' then
>       found = find(upper(input[position]), upper(mapping))
>    else
>       found = find(input[position], mapping)
>    end if
>end for

I changed the order of the if statement to
      if 'A' <= upper(input[position]) <= 'Z' then
and now it seems to work fine.

Any explanation why simply changing the order of 'A' and 'Z'
with the corresponding change to the >= evaluations would
change the outcome?  From what I can tell, the two lines are
functionally equivalent and should both work.
    if 'Z' >= upper(input[position]) >= 'A' then -- won't work
if 'Z' is greater than/equal to variable is greater than/equal to 'A'
    if 'A' <= upper(input[position]) <= 'Z' then -- works
if 'A' is less than/equal to variable is less than/equal to 'Z'

Am I wrong about this?

James Powell
Now I'm really confused

new topic     » goto parent     » topic index » view message » categorize

3. Re: evaluation of if statement

Hi James,
this statement of yours:
>    if 'Z' >= upper(input[position]) >= 'A' then

is equivalent to:

    if (('Z' >= upper(input[position])) >= 'A') then
which breaks down to:

    temp = ('Z' >= upper(input[position])
    if temp >= 'A' then

meaning that after the first comparision, that 'temp' is going to either have
the value 0 or 1. Thus
the next comparison is always false because both 0 and 1 and less than 'A'.

Try this instead:

   if 'Z' <= upper(input[position]) and
      upper(input[position]) >= 'A' then



-----
Derek.


18/03/2002 1:10:38 PM, munchr at mac.com wrote:

>
>I can't seem to get the following code to work.  Should this work like
>I expect it to, or does it need to be rewritten?
>
>Ideally, given a sequence of {1,2,3} it should evaluate false, but
>given {'b',2,3}, or {'b','B','b'} it should process true when
>"position" corresponds to the position of the letter in the sequence.
>But it always processes as false, even when the sequence element
>has an ascii value between 'Z' and 'A'.
>
>for position = 1 to length(input) do
>    if 'Z' >= upper(input[position]) >= 'A' then
>       found = find(upper(input[position]), upper(mapping))
>    else
>       found = find(input[position], mapping)
>    end if
>end for
>
>am i missing something simple here?
>
>James Powell
>tired and confused at this point 
>
>
>
>
---------
Cheers,
Derek Parnell 
ICQ# 7647806

new topic     » goto parent     » topic index » view message » categorize

4. Re: evaluation of if statement

At 01:26 PM 18/03/2002 +1100, Mr. Parnell wrote:
>Hi James,
>this statement of yours:
> >    if 'Z' >= upper(input[position]) >= 'A' then
>
>is equivalent to:
>
>     if (('Z' >= upper(input[position])) >= 'A') then
>which breaks down to:
>
>     temp = ('Z' >= upper(input[position])
>     if temp >= 'A' then
>
>meaning that after the first comparision, that 'temp' is going to either 
>have the value 0 or 1. Thus
>the next comparison is always false because both 0 and 1 and less than 'A'.
>
>Try this instead:
>
>    if 'Z' <= upper(input[position]) and
>       upper(input[position]) >= 'A' then

I see... so my little shortcut is biting me in the end.  I guess that means 
that my
"fix" of using if 'A' <= x <= 'Z' is doing the same thing, assuming x is a 
sufficiently
high value atom, rather than a letter.  Exept that I don't really care 
whether it is a
letter or not, only that if it is, it should match up to previous values 
whether it was
upper case or lower case.  Which then leads me to wonder, if i get a 
numeric value
that matches my test, and matches a previous letter value, am i going to 
screw up
my data processing?  Thanks for the help, I guess I have a lot more testing 
to do
before I decide to finalize a design.

James Powell

new topic     » goto parent     » topic index » view message » categorize

5. Re: evaluation of if statement

I have done away with the offending if...then statements
entirely.  I believe it was completely unnecessary in
the first place.  The line

found = find(upper(input[position]), upper(mapping))

is behaving exactly as I wanted it to, on its own, for
seemingly all alpha-numeric cases, as i am treating
all data as atoms, and checking against a list of
previous values.  Thus, whether it is checking for
1, 4, 10, 45, 'a', 'I', 'z', or whatever, it properly examines
the current value against previous values in every case
I have tested, and against random tests.

Thank you all for your assistance, and explanation of
the nature of if...then evaluations.  I will be sure to keep
this in mind in the future.

James Powell
Thanks to D. Parnell, C.K. Lester, A. Serpa and to anyone
else from whom I have not yet received replies.

new topic     » goto parent     » topic index » view message » categorize

6. Re: evaluation of if statement

Derek Parnell wrote:

> Hi James,
>
> this statement of yours:
> >    if 'Z' >= upper(input[position]) >= 'A' then
>
> is equivalent to:
>
>     if (('Z' >= upper(input[position])) >= 'A') then
>
> which breaks down to:
>
>     temp = ('Z' >= upper(input[position])
>     if temp >= 'A' then
>
> meaning that after the first comparision, that 'temp' is going to either
> have the value 0 or 1. Thus the next comparison is always false because
> both 0 and 1 and less than 'A'.
>
> Try this instead:
>
>    if 'Z' <= upper(input[position]) and
>       upper(input[position]) >= 'A' then

You can also make thinks look similar to James' code like so:

  ** some code **
if 'Z' >= upper(input[position]) and upper(input[position]) >= 'A' then
    --                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
end if
  ** other code **

Notice that all that has been added to James' code is an 'and' and the
object for comparison again.

Since that's a lot of extra typing, we could assign 'upper(input[position])'
to a variable. This will prevent Euphoria from searching the 'input'
sequence, then running the 'upper()' function twice, which is faster code,
and it saves on the fingers a little:

integer ch
  ** some code **
ch = upper(input[position])

if 'Z' >= ch and ch >= 'A' then
    -- do something
end if
  ** other code **

--
Carl

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu