How to abruptly end a program?

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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Hi,

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 :slight_smile: 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

···

On Sat, Mar 15, 2008 at 5:01 PM, Tom Cloyd <tomcloyd@comcast.net> 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.)

···

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

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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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

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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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

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

···

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.

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

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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~