人気ブログランキング | 話題のタグを見る

プログラムを変数に入れる edit.rb

irb で対話的にプログラムを実行している時に、プログラムを変数に入れておいてそれを編集できたら便利ではないかと思った。変数 a に [1, 2, 3] というデータが入っているとする。これの総和を求めるプログラムを作って試してみたいのだが、irb を終了してエディターを起動すると a のデータが消滅してしまう。要は変数 a のデータを残したまま irb 上でプログラムを作りたいのだ。変数 prog にプログラムの文字列を入れて eval すれば一応それは可能だが、この場合は、prog の文字列の編集ができない。

そこで、変数の文字列を編集してそれを変数に戻すプログラム edit.rb を作った。edit.rb の中にはメソッド edit(prog) が記述してある。irb などから require 'edit' して、a = edit とすると、vi が起動してプログラムの編集ができる。vi を終了すると編集されたプログラムが変数 a に入っているので、eval a で実行することができる。また、a の内容を見たいときは、puts a とすればよい。a に手を加えたいときは、a = edit(a) とすると vi で編集できる。

変数に入れたプログラムは、save(path, var) メソッドでファイルに保存できる。呼び出しは、a = IO.rea(path) でできる。

実行例

~$ irb
irb(main):001:0> require 'edit'
=> true
irb(main):002:0> a = edit
=> "puts 'hello, world'\n"
irb(main):003:0> puts a
puts 'hello, world'
=> nil
irb(main):004:0> eval a
hello, world
=> nil
irb(main):005:0> a = edit(a)
=> "puts 'hello, world'\nputs 'nice to meet you'\n"
irb(main):006:0> eval a
hello, world
nice to meet you
=> nil
irb(main):006:0> save('hello.rb', a)
=> 44
irb(main):007:0> b = IO.read('hello.rb')
=> "puts 'hello, world'\nputs 'nice to meet you'\n"
irb(main):006:0> eval b
hello, world
nice to meet you

ファイル名: edit.rb (open は半角英数に変換して使用)

def edit(prog = nil)
  if prog != nil
    File.open('temp.txt','w') {|f| f.write(prog) }
  end
  system "vi temp.txt"
  prog = IO.read('temp.txt')
  system "rm temp.txt"
  prog
end

dev save(path, var)
  File.open(path, 'w') {|f| f.write(var) }
end

注: Windows の場合は vi を適当なエディターに変更する。system 'rm ...' は、system 'del ...' に変更。
by tnomura9 | 2008-09-19 21:53 | Ruby | Comments(0)
<< edb.rb で簡単プログラム... 簡単データベース改訂版 eas... >>