Reffering back to caller's binding


#1

Hello Rubyists,

I am trying to define a helper method which displays a ruby expression
and then displays the results of that expression via puts. Initially I
did this, which obviously did not work:

def peval( expression )
puts expression
puts eval( expression )
puts “”
end

of course when I ran it, the scope of the method does not include
objects in the calling scope… so then I realized it had to do with
bindings and I defined this:

def peval
f,b = yield
puts f
puts eval(f,b)
puts “”
end

and this works, but, its really ugly:

peval { [“map.inspect”, binding()] }

so my question is, is there a way to obtain the caller’s binding so that
I do not have to specify it in the call? Is this in Pickaxe and I spaced
out on that section? I eally just want to be able to specify the
expression (in quotes), get it to display, see the results, move on…


#2

On Sat, Apr 18, 2009 at 6:16 PM, Owein H. removed_email_address@domain.invalid
wrote:

end
end

and this works, but, its really ugly:

peval { [“map.inspect”, binding()] }

so my question is, is there a way to obtain the caller’s binding so that
I do not have to specify it in the call? Is this in Pickaxe and I spaced
out on that section? I eally just want to be able to specify the
expression (in quotes), get it to display, see the results, move on…

Explicitly specify the block parameter and use its #binding method to
get the binding for where the block was defined, i.e.

def peval(&block)
f,b = block.call
puts f
puts eval(f,block.binding)
puts “”
end

peval { [“var.inspect”] }

OUTPUT:
var.inspect
[1, 2, 3]

Regards,
Sean


#3

On Sun, Apr 19, 2009 at 2:10 AM, Sean O’Halpin removed_email_address@domain.invalid
wrote:

puts “”
puts “”

peval { [“var.inspect”] }

OUTPUT:
var.inspect
[1, 2, 3]

Regards,
Sean

I leave it as an exercise for the reader to work out the definition of
‘var’ :wink:


#4

peval { [“var.inspect”] }

Interesting solution. The solution would be even better if ruby had a
Proc#to_str method built in or if #to_a returned a sexpr (à la lisp)
that could be easily manipulated, printed, and evaluated.


#5

On Sun, Apr 19, 2009 at 6:36 AM, Leo removed_email_address@domain.invalid wrote:

peval { [“var.inspect”] }

Interesting solution. The solution would be even better if ruby had a
Proc#to_str method built in or if #to_a returned a sexpr (à la lisp)
that could be easily manipulated, printed, and evaluated.

I agree - it would be nice if this was built-it. However, you can get
it with ParseTree:

require ‘ruby2ruby’
require ‘parse_tree_extensions’
def dump(&block)
puts block.to_ruby.gsub(/^proc\s*{(.*)}$/, ‘\1’).strip
puts block.call
end

need to call to_ruby on a method before the to_ruby call will work on

blocks
def dummy
end
method(:dummy).to_ruby

var = [1,2,3]
dump { var.inspect }
#> var.inspect
#> [1, 2, 3]

also, just to show you can do this too:

p proc { 1 + 1 }.to_sexp
#> s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:call, s(:lit,
1), :+, s(:arglist, s(:lit, 1))))

Regards,
Sean


#6

Fabulous! Thank you so much for the help!


#7

On Apr 19, 2009, at 03:41 , Sean O’Halpin wrote:

I agree - it would be nice if this was built-it. However, you can get
it with ParseTree:

require ‘ruby2ruby’
require ‘parse_tree_extensions’
def dump(&block)
puts block.to_ruby.gsub(/^proc\s*{(.*)}$/, ‘\1’).strip
puts block.call
end

except that PT is essentially dead because it can’t work on 1.0…


#8

On Apr 19, 2009, at 16:14 , Sean O’Halpin wrote:

except that PT is essentially dead because it can’t work on 1.[9]…

I’m in denial :confused:

have fun with that. I hope it works well for you.


#9

On Sun, Apr 19, 2009 at 9:28 PM, Ryan D. removed_email_address@domain.invalid
wrote:

puts block.call
end

except that PT is essentially dead because it can’t work on 1.0…

I’m in denial :confused: