[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

how to abruptly end a program?

Tom Cloyd

3/15/2008 6:01:00 AM

I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes across a
line anywhere in the source containing just ?_ _END_ _?, with no leading
or trailing whitespace, it treats that line as the end of the
program?any subsequent lines will not be treated as program code."

That's not what's happening for me. The following -
_ _END_ _
__END__
_END_

all produce the same result for me - "undefined local variable or method"
That DOES bring the program to an abrupt end, but its rather ungraceful.
Is this the intended result - a crash due to an interpreter error?

Tom

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


8 Answers

Arlen Cuss

3/15/2008 6:12:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

Hi,

On Sat, Mar 15, 2008 at 5:01 PM, Tom Cloyd <tomcloyd@comcast.net> wrote:

> all produce the same result for me - "undefined local variable or method"
> That DOES bring the program to an abrupt end, but its rather ungraceful.
> Is this the intended result - a crash due to an interpreter error?
>

Certainly not :) Though I guess any identifier could do that then. Are you
sure there's no whitespace or other content on the line? Can you show us an
example?

celtic@sohma:~$ cat test.rb
#!/usr/bin/env ruby

puts "Hi there!"

__END__

This is just great.

celtic@sohma:~$ ruby test.rb
Hi there!
celtic@sohma:~$

Thanks!

Arlen

Joel VanderWerf

3/15/2008 6:12:00 AM

0

Tom Cloyd wrote:
> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes across a
> line anywhere in the source containing just ?_ _END_ _?, with no leading
> or trailing whitespace, it treats that line as the end of the
> program?any subsequent lines will not be treated as program code."
>
> That's not what's happening for me. The following -
> _ _END_ _
> __END__
> _END_
>
> all produce the same result for me - "undefined local variable or method"
> That DOES bring the program to an abrupt end, but its rather ungraceful.
> Is this the intended result - a crash due to an interpreter error?

What the quote (a bit ambiguous perhaps) means is that the __END__ line
and following lines are not treated as part of the program text. It has
nothing to do with control flow. It's like comment block that runs to
the end of the file without any explicit termination. (It's more than
that because you can read it with DATA.)

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Tom Cloyd

3/15/2008 6:47:00 AM

0

Joel VanderWerf wrote:
> Tom Cloyd wrote:
>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
>> across a line anywhere in the source containing just ?_ _END_ _?,
>> with no leading or trailing whitespace, it treats that line as the
>> end of the program?any subsequent lines will not be treated as
>> program code."
>>
>> That's not what's happening for me. The following -
>> _ _END_ _
>> __END__
>> _END_
>>
>> all produce the same result for me - "undefined local variable or
>> method"
>> That DOES bring the program to an abrupt end, but its rather
>> ungraceful. Is this the intended result - a crash due to an
>> interpreter error?
>
> What the quote (a bit ambiguous perhaps) means is that the __END__
> line and following lines are not treated as part of the program text.
> It has nothing to do with control flow. It's like comment block that
> runs to the end of the file without any explicit termination. (It's
> more than that because you can read it with DATA.)
>
OK, but couldn't ANY uninitialized variable achieve the same messy
result? What's the point? This surely can't be the intended result.
Makes no sense to me.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Joel VanderWerf

3/15/2008 6:54:00 AM

0

Tom Cloyd wrote:
> Joel VanderWerf wrote:
>> Tom Cloyd wrote:
>>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
>>> across a line anywhere in the source containing just ?_ _END_ _?,
>>> with no leading or trailing whitespace, it treats that line as the
>>> end of the program?any subsequent lines will not be treated as
>>> program code."
>>>
>>> That's not what's happening for me. The following -
>>> _ _END_ _
>>> __END__
>>> _END_
>>>
>>> all produce the same result for me - "undefined local variable or
>>> method"
>>> That DOES bring the program to an abrupt end, but its rather
>>> ungraceful. Is this the intended result - a crash due to an
>>> interpreter error?
>>
>> What the quote (a bit ambiguous perhaps) means is that the __END__
>> line and following lines are not treated as part of the program text.
>> It has nothing to do with control flow. It's like comment block that
>> runs to the end of the file without any explicit termination. (It's
>> more than that because you can read it with DATA.)
>>
> OK, but couldn't ANY uninitialized variable achieve the same messy
> result? What's the point? This surely can't be the intended result.
> Makes no sense to me.

__END__ by itself on a line shouldn't exit the program. If you're
getting that error, maybe there is an extra char on the line. A space
perhaps?

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Tom Cloyd

3/15/2008 7:19:00 AM

0

Joel VanderWerf wrote:
> Tom Cloyd wrote:
>> Joel VanderWerf wrote:
>>> Tom Cloyd wrote:
>>>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
>>>> across a line anywhere in the source containing just ?_ _END_ _?,
>>>> with no leading or trailing whitespace, it treats that line as the
>>>> end of the program?any subsequent lines will not be treated as
>>>> program code."
>>>>
>>>> That's not what's happening for me. The following -
>>>> _ _END_ _
>>>> __END__
>>>> _END_
>>>>
>>>> all produce the same result for me - "undefined local variable or
>>>> method"
>>>> That DOES bring the program to an abrupt end, but its rather
>>>> ungraceful. Is this the intended result - a crash due to an
>>>> interpreter error?
>>>
>>> What the quote (a bit ambiguous perhaps) means is that the __END__
>>> line and following lines are not treated as part of the program
>>> text. It has nothing to do with control flow. It's like comment
>>> block that runs to the end of the file without any explicit
>>> termination. (It's more than that because you can read it with DATA.)
>>>
>> OK, but couldn't ANY uninitialized variable achieve the same messy
>> result? What's the point? This surely can't be the intended result.
>> Makes no sense to me.
>
> __END__ by itself on a line shouldn't exit the program. If you're
> getting that error, maybe there is an extra char on the line. A space
> perhaps?
>
Yes, that would explain it, but I made sure this problem didn't occur
from the beginning, which is one reason I'm puzzled. I really don't see
anything wrong with what I'm feeding the interpreter.

So, I did a different test program -

require 'readline'
puts "test under way\ninput var: "
#opt = readline( "=--> \n")
opt = gets.chomp
puts( opt)
__END__
puts( opt)

result:
test under way
input var:
5
5

Here, we don't get an error. We just get ignored.
This is nuts.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Joel VanderWerf

3/15/2008 7:38:00 AM

0

Tom Cloyd wrote:
> So, I did a different test program -
>
> require 'readline'
> puts "test under way\ninput var: "
> #opt = readline( "=--> \n")
> opt = gets.chomp
> puts( opt)
> __END__
> puts( opt)
>
> result:
> test under way
> input var:
> 5
> 5
>
> Here, we don't get an error. We just get ignored.
> This is nuts.

Looks correct. The __END__ line and everything after it is ignored.
What's your example with an error?

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Stefano Crocco

3/15/2008 7:42:00 AM

0

On Saturday 15 March 2008, Tom Cloyd wrote:
> Joel VanderWerf wrote:
> > Tom Cloyd wrote:
> >> Joel VanderWerf wrote:
> >>> Tom Cloyd wrote:
> >>>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
> >>>> across a line anywhere in the source containing just =93_ _END_ _=94,
> >>>> with no leading or trailing whitespace, it treats that line as the
> >>>> end of the program=97any subsequent lines will not be treated as
> >>>> program code."
> >>>>
> >>>> That's not what's happening for me. The following -
> >>>> _ _END_ _
> >>>> __END__
> >>>> _END_
> >>>>
> >>>> all produce the same result for me - "undefined local variable or
> >>>> method"
> >>>> That DOES bring the program to an abrupt end, but its rather
> >>>> ungraceful. Is this the intended result - a crash due to an
> >>>> interpreter error?
> >>>
> >>> What the quote (a bit ambiguous perhaps) means is that the __END__
> >>> line and following lines are not treated as part of the program
> >>> text. It has nothing to do with control flow. It's like comment
> >>> block that runs to the end of the file without any explicit
> >>> termination. (It's more than that because you can read it with DATA.)
> >>
> >> OK, but couldn't ANY uninitialized variable achieve the same messy
> >> result? What's the point? This surely can't be the intended result.
> >> Makes no sense to me.
> >
> > __END__ by itself on a line shouldn't exit the program. If you're
> > getting that error, maybe there is an extra char on the line. A space
> > perhaps?
>
> Yes, that would explain it, but I made sure this problem didn't occur
> from the beginning, which is one reason I'm puzzled. I really don't see
> anything wrong with what I'm feeding the interpreter.
>
> So, I did a different test program -
>
> require 'readline'
> puts "test under way\ninput var: "
> #opt =3D readline( "=3D--> \n")
> opt =3D gets.chomp
> puts( opt)
> __END__
> puts( opt)
>
> result:
> test under way
> input var:
> 5
> 5
>
> Here, we don't get an error. We just get ignored.
> This is nuts.
>
> t.

As others said, when ruby sees the __END__ identifier on a line by itself
(without leading or trailing spaces), it treats it, and any text following =
it,=20
approximately as a comment. This means that the code is not parsed (syntax
errors after that line aren't recognized) and, obviously, not executed.
Besides, the constant DATA is set to a File object which contains that text.

This is consistent with the result you get from your piece of code: without
the __END__, 5 would have been written 3 times: the first when you entered =
it=20
from the keyboard, the other two because of the two puts. Since the second
puts is after __END__, instead, you only get it twice: the second puts is
ignored.

Try this, for example:

puts "This is the class of DATA: #{DATA.class}"
puts "These are the contents of DATA:\n\n#{DATA.read}"
__END__
This is not valid ruby code

The output is:
This is the class of DATA: File
These are the contents of DATA:

This is not valid ruby code

Of course, removing the __END__ line causes a syntax error:

=2E/prova.rb:6: syntax error, unexpected kNOT, expecting $end
This is not valid ruby code

Regarding your first piece of code (the one which produces the NoMethodErro=
r),=20
are you sure the error isn't produced before end?

Stefano

Tom Cloyd

3/15/2008 7:55:00 AM

0

Stefano Crocco wrote:
> On Saturday 15 March 2008, Tom Cloyd wrote:
>
>> Joel VanderWerf wrote:
>>
>>> Tom Cloyd wrote:
>>>
>>>> Joel VanderWerf wrote:
>>>>
>>>>> Tom Cloyd wrote:
>>>>>
>>>>>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
>>>>>> across a line anywhere in the source containing just ?_ _END_ _?,
>>>>>> with no leading or trailing whitespace, it treats that line as the
>>>>>> end of the program?any subsequent lines will not be treated as
>>>>>> program code."
>>>>>>
>>>>>> That's not what's happening for me. The following -
>>>>>> _ _END_ _
>>>>>> __END__
>>>>>> _END_
>>>>>>
>>>>>> all produce the same result for me - "undefined local variable or
>>>>>> method"
>>>>>> That DOES bring the program to an abrupt end, but its rather
>>>>>> ungraceful. Is this the intended result - a crash due to an
>>>>>> interpreter error?
>>>>>>
>>>>> What the quote (a bit ambiguous perhaps) means is that the __END__
>>>>> line and following lines are not treated as part of the program
>>>>> text. It has nothing to do with control flow. It's like comment
>>>>> block that runs to the end of the file without any explicit
>>>>> termination. (It's more than that because you can read it with DATA.)
>>>>>
>>>> OK, but couldn't ANY uninitialized variable achieve the same messy
>>>> result? What's the point? This surely can't be the intended result.
>>>> Makes no sense to me.
>>>>
>>> __END__ by itself on a line shouldn't exit the program. If you're
>>> getting that error, maybe there is an extra char on the line. A space
>>> perhaps?
>>>
>> Yes, that would explain it, but I made sure this problem didn't occur
>> from the beginning, which is one reason I'm puzzled. I really don't see
>> anything wrong with what I'm feeding the interpreter.
>>
>> So, I did a different test program -
>>
>> require 'readline'
>> puts "test under way\ninput var: "
>> #opt = readline( "=--> \n")
>> opt = gets.chomp
>> puts( opt)
>> __END__
>> puts( opt)
>>
>> result:
>> test under way
>> input var:
>> 5
>> 5
>>
>> Here, we don't get an error. We just get ignored.
>> This is nuts.
>>
>> t.
>>
>
> As others said, when ruby sees the __END__ identifier on a line by itself
> (without leading or trailing spaces), it treats it, and any text following it,
> approximately as a comment. This means that the code is not parsed (syntax
> errors after that line aren't recognized) and, obviously, not executed.
> Besides, the constant DATA is set to a File object which contains that text.
>
> This is consistent with the result you get from your piece of code: without
> the __END__, 5 would have been written 3 times: the first when you entered it
> from the keyboard, the other two because of the two puts. Since the second
> puts is after __END__, instead, you only get it twice: the second puts is
> ignored.
>
> Try this, for example:
>
> puts "This is the class of DATA: #{DATA.class}"
> puts "These are the contents of DATA:\n\n#{DATA.read}"
> __END__
> This is not valid ruby code
>
> The output is:
> This is the class of DATA: File
> These are the contents of DATA:
>
> This is not valid ruby code
>
> Of course, removing the __END__ line causes a syntax error:
>
> ./prova.rb:6: syntax error, unexpected kNOT, expecting $end
> This is not valid ruby code
>
> Regarding your first piece of code (the one which produces the NoMethodError),
> are you sure the error isn't produced before end?
>
> Stefano
>
>
>
Stefano,
You're right. I misread my own output - seeing two 5's, I thought them
to be output, without realizing that the first wasn't. Yes, it's getting
a bit late here. Maybe it's time to stop.

Thanks to you and Joel for your comments!

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~