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