Thanks, Bill. It sounds like irb will fill my needs. 

I have to say that featuring eval in the tutorials when it doesn't work
for a simple set of interactions like setting a variable and then
printing it seems very newbie unfriendly.

Some languages have a culture that excludes all but the smartest and
those who are willing to devote all their time to memorizing the
nuances. I would put Perl in that category. The initial "affect" of the
Ruby language and community is else-wise, but a couple of things make me
wonder. This includes tutorials that don't work in every case and the
fact that there is no free version of documentation for the current
version, which was released > 3 months ago.

If it weren't for people like you willing to respond it could be very
off-putting indeed.


-----Original Message-----
From: Bill Kelly [mailto:billk / cts.com] 
Sent: Sunday, July 01, 2007 12:30 AM
To: ruby-talk ML
Subject: Re: Newbie Question. eval.rb variable scope issue

From: "Rishel,Wes" <Wes.Rishel / gartner.com>
> 
> I am a Python duffer who got interested in Rails an decided to check
out
> Ruby.
> 
> This dandy little Ruby script illustrates the issue
> 
> a = ['word = 2', 'word']
> 
> a.each do | line |
>        begin
>               print eval(line).inspect, "\n"
>        rescue ScriptError, StandardError
>               print line + "\n"   # WJR change
>               printf "ERR: %s\n", $! || 'exception raised'
>        end
> end
> 
> After some perusing the available on-line manuals I have not been able
> to find a way to fix eval.rb to remember the scope of variables
created
> in the input to it. Perhaps I am missing something obvious?

Welcome !

I don't know the exact reason, but it seems you'll need to
obtain a binding context from outside the iterator block.
E.g.

  a = ['word = 2', 'word']
  b = binding
  a.each {|line| p( eval(line, b) ) }


Incidentally, have you found `irb` yet?  There should be an irb.bat
in the bin directory next to your ruby.exe.  IRB is "interactive
ruby", similar to invoking python with no arguments.

A couple tips:

  p(expr) is a shortcut for puts(expr.inspect)

So,

  print eval(line).inspect, "\n"

can be written as:

  p line

Also, puts is like print, but adds the "\n" for you.
So,

  print line + "\n"

can be:

  puts line



Hope this helps,

Regards,

Bill

  

This e-mail message, including any attachments, is for the sole use of the person to whom it has been sent, and may contain information that is confidential or legally protected. If you are not the intended recipient or have received this message in error, you are not authorized to copy, distribute, or otherwise use this message or its attachments. Please notify the sender immediately by return e-mail and permanently delete this message and any attachments.  Gartner makes no warranty that this e-mail is error or virus free.