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:
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...
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
···
On Sat, Apr 18, 2009 at 6:16 PM, Owein Herrmann <oherrmann@gmail.com> wrote:
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:
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...
I leave it as an exercise for the reader to work out the definition of 'var'
···
On Sun, Apr 19, 2009 at 2:10 AM, Sean O'Halpin <sean.ohalpin@gmail.com> wrote:
On Sat, Apr 18, 2009 at 6:16 PM, Owein Herrmann <oherrmann@gmail.com> wrote:
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:
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...
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
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
# 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
···
On Sun, Apr 19, 2009 at 6:36 AM, Leo <minilith@gmail.com> 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.