Sam Roberts wrote:

>Thanks, thats what I want.
>
>Looking around, I can't seem to find a way to introspect the stack,
>other than that. I.e., to look at my callers context, see what it's
>local variables are, etc.
>
>This kind of feature would be interesting, I could do
>
>def pp_local
>  ctx = stack[1] # assume current stack is stack[0]
>  puts "in method #{ctx.method_name},"
>  ctx.locals.each { |sym, o|
>    print "#{sym} has value "
>    pp o
>  end
>end
>
>Is anything like this currently possible?
>
>Thanks,
>Sam
>  
>

It's not quite what you want but you access your callers context by 
setting a trace function to the binding for the calling scope.

Something like this

class ContextStack
  attr_accessor :stack

    INIT_STACK_TIMES = 3
    CALL_STACK_OFFSET = 3

  def initialize
    @stack = [TOPLEVEL_BINDING] * INIT_STACK_TIMES
  end


  def trace_func(event, file, line, id, binding)
    case event
    when 'call', 'class'
      @stack.push binding
    when 'return', 'end'
      @stack.pop
    end
  end

  @@context_stack = ContextStack.new
  set_trace_func proc {|event, file, line, id, binding, klass|
    @@context_stack.trace_func(event, file, line, id, binding)
  }

  def ContextStack.get_var(level, variable)
    eval "#{variable}", @@context_stack.stack[level]
  end

  def ContextStack.set_var(level, variable, value)
    eval "#{variable}=#{value}", @@context_stack.stack[level]
  end
end

def test()
  puts "x = #{ContextStack.get_var(1, "x")}"

  ContextStack.set_var(1, "x", 10)
end


x = 5

test()

puts "now x = #{x}"

HTH

--
Mark Sparshatt