Calling Irb from inside an application

Hi,

this may be easy to anwer but it is difficult to google for.

While developping I would like to play around with objects from
time to time. Just like this:

    irb(main):001:0> class C ; def f ; "F" ; end ; end
    => nil
    irb(main):002:0> irb C.new
    irb#1(#<C:0xb7910d40>):001:0> f
    => "F"
    irb#1(#<C:0xb7910d40>):002:0>

In common my classes are not so easy to type in. So, I would like
to call Irb from somewhere inside the application as I do here:

    ---->-call_irb.rb---------------
    #!/usr/bin/ruby

    class C
      def f
        "F"
      end
    end

    if $0 == __FILE__ then
      require "irb"
      $c = C.new
      IRB.start
    end
    ----<---------------------------

and then

    user@host $ ./call_irb.rb
    irb(main):001:0> irb $c
    irb#1(#<C:0xb7be4ee0>):001:0> f
    => "F"
    irb#1(#<C:0xb7be4ee0>):002:0>

Is there a way how I can call C.new's Irb directly without doing
the long-winded definition of a global variable first? I already
examined the irb sources but this seems to be well-hidden to me.

Thanks in advance and Merry Christmas,

Bertram

···

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

Alle martedì 25 dicembre 2007, Bertram Scharpf ha scritto:

Hi,

this may be easy to anwer but it is difficult to google for.

While developping I would like to play around with objects from
time to time. Just like this:

    irb(main):001:0> class C ; def f ; "F" ; end ; end
    => nil
    irb(main):002:0> irb C.new
    irb#1(#<C:0xb7910d40>):001:0> f
    => "F"
    irb#1(#<C:0xb7910d40>):002:0>

In common my classes are not so easy to type in. So, I would like
to call Irb from somewhere inside the application as I do here:

    ---->-call_irb.rb---------------
    #!/usr/bin/ruby

    class C
      def f
        "F"
      end
    end

    if $0 == __FILE__ then
      require "irb"
      $c = C.new
      IRB.start
    end
    ----<---------------------------

and then

    user@host $ ./call_irb.rb
    irb(main):001:0> irb $c
    irb#1(#<C:0xb7be4ee0>):001:0> f
    => "F"
    irb#1(#<C:0xb7be4ee0>):002:0>

Is there a way how I can call C.new's Irb directly without doing
the long-winded definition of a global variable first? I already
examined the irb sources but this seems to be well-hidden to me.

Thanks in advance and Merry Christmas,

Bertram

Not a direct answer to your question, but can't you load the file with the
definition of the class in irb?

Stefano

In common my classes are not so easy to type in. So, I would like
to call Irb from somewhere inside the application as I do here:

   if $0 == __FILE__ then
     require "irb"
     $c = C.new
     IRB.start
   end

I'm a bit confused. Your subject line IS handled by this code. Indeed, this is what I grabbed from some of my code when I read the subject line:

   def explore
     Object.const_set :"G", self
     require 'irb'
     puts "Your grammar is in the constant G"
     IRB.start(__FILE__)
   end

So, what is the actual subject of this question? It doesn't seem to be "long-windedness" (below) either.

and then

   user@host $ ./call_irb.rb
   irb(main):001:0> irb $c
   irb#1(#<C:0xb7be4ee0>):001:0> f
   => "F"
   irb#1(#<C:0xb7be4ee0>):002:0>

Is there a way how I can call C.new's Irb directly without doing
the long-winded definition of a global variable first? I already
examined the irb sources but this seems to be well-hidden to me.

I'm confused and havet o assume the question is a bit vague. How is "$c = " long winded? What do you actually want to know?

···

On Dec 25, 2007, at 05:08 , Bertram Scharpf wrote:

Merry christmas!

This was mercilessly stolen and adapted from a post on Errs blog (only google has the answer ;):

require 'irb'

module IRB
   def self.start_session(binding)
     IRB.setup(nil)

     workspace = WorkSpace.new(binding)

     if @CONF[:SCRIPT]
       irb = Irb.new(workspace, @CONF[:SCRIPT])
     else
       irb = Irb.new(workspace)
     end

     @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
     @CONF[:MAIN_CONTEXT] = irb.context

     trap("SIGINT") do
       irb.signal_handle
     end

     catch(:IRB_EXIT) do
       irb.eval_input
     end
   end
end

def meths(o); puts (o.methods - Class.new.methods).join("\n"); end

def dROP! b
  old_args = ARGV
  ARGV.size.times { ARGV.shift }

  if defined? IRBHelper
    foo = Class.new
    foo.instance_eval do
      include IRBHelper
    end
    puts "Helper Methods: #{(foo.new.methods - Class.new.methods).sort.join(', ')}"
    include IRBHelper
  end

  IRB.start_session b
  old_args.each { |a| ARGV << a }
end

···

On 25 Dec 2007, at 13:26, Stefano Crocco wrote:

Alle martedì 25 dicembre 2007, Bertram Scharpf ha scritto:

Hi,

this may be easy to anwer but it is difficult to google for.

While developping I would like to play around with objects from
time to time. Just like this:

   irb(main):001:0> class C ; def f ; "F" ; end ; end
   => nil
   irb(main):002:0> irb C.new
   irb#1(#<C:0xb7910d40>):001:0> f
   => "F"
   irb#1(#<C:0xb7910d40>):002:0>

In common my classes are not so easy to type in. So, I would like
to call Irb from somewhere inside the application as I do here:

   ---->-call_irb.rb---------------
   #!/usr/bin/ruby

   class C
     def f
       "F"
     end
   end

   if $0 == __FILE__ then
     require "irb"
     $c = C.new
     IRB.start
   end
   ----<---------------------------

and then

   user@host $ ./call_irb.rb
   irb(main):001:0> irb $c
   irb#1(#<C:0xb7be4ee0>):001:0> f
   => "F"
   irb#1(#<C:0xb7be4ee0>):002:0>

Is there a way how I can call C.new's Irb directly without doing
the long-winded definition of a global variable first? I already
examined the irb sources but this seems to be well-hidden to me.

Thanks in advance and Merry Christmas,

Bertram

Not a direct answer to your question, but can't you load the file with the
definition of the class in irb?

Stefano

Hi,

···

Am Mittwoch, 26. Dez 2007, 05:16:03 +0900 schrieb Ryan Davis:

On Dec 25, 2007, at 05:08 , Bertram Scharpf wrote:

Is there a way how I can call C.new's Irb directly without doing
the long-winded definition of a global variable first? I already
examined the irb sources but this seems to be well-hidden to me.

I'm confused and havet o assume the question is a bit vague. How is "$c = "
long winded? What do you actually want to know?

I wanted to know how to do it without having to type in the same
constant or global variable name every time.

Bertram

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

Hi James,

···

Am Dienstag, 25. Dez 2007, 23:01:54 +0900 schrieb James Tucker:

This was mercilessly stolen and adapted from a post on Errs blog (only
google has the answer ;):

      [...]
  old_args = ARGV
  ARGV.size.times { ARGV.shift }
      [...]
  old_args.each { |a| ARGV << a }
      [...]

The code is not actually mature. The clearing could be done by an
ARGV.clear; this part won't work either because old_args will be
cleared as well.

Besides that the solution works perfectly. Thank you very much!

Bertram

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de