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)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||