how to abruptly end a program?

T

Tom Cloyd

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
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
A

Arlen Cuss

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

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 :) 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
 
J

Joel VanderWerf

Tom said:
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.)
 
T

Tom Cloyd

Joel said:
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
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
J

Joel VanderWerf

Tom said:
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?
 
T

Tom Cloyd

Joel said:
__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
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
J

Joel VanderWerf

Tom said:
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?
 
S

Stefano Crocco

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
 
T

Tom Cloyd

Stefano said:
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
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top