Reffering back to caller's binding

O

Owein Herrmann

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...
 
S

Sean O'Halpin

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 )
=A0puts expression
=A0puts eval( expression )
=A0puts ""
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
=A0f,b =3D yield
=A0puts f
=A0puts eval(f,b)
=A0puts ""
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 =3D block.call
puts f
puts eval(f,block.binding)
puts ""
end

peval { ["var.inspect"] }

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

Regards,
Sean
 
S

Sean O'Halpin

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 )
=A0puts expression
=A0puts eval( expression )
=A0puts ""
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
=A0f,b =3D yield
=A0puts f
=A0puts eval(f,b)
=A0puts ""
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)
=A0f,b =3D block.call
=A0puts f
=A0puts eval(f,block.binding)
=A0puts ""
end

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=
' ;)
 
L

Leo

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 (=E0 la lisp)
that could be easily manipulated, printed, and evaluated.
 
S

Sean O'Halpin

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 (=E0 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 blo=
cks
def __dummy__
end
method:)__dummy__).to_ruby

var =3D [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
 
R

Ryan Davis

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...
 

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

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top