読者です 読者をやめる 読者になる 読者になる

iosでLINE風味にIRBできるようにする

diary

Qiita から引っ越し。

次のバージョンのPictRubyでチャット風インターフェースを作れるようにしたのでirbを実装した。

pictruby-irb-01.png

コードは以下のような感じに。エラーハンドリングはさすがにObjective-C側に書かないとダメかなと思ったいたのだけど、例外キャッチするだけでうまくいった。Rubyの表現力はやはり高い。

# # 10_irb
#
# ## Description
# Interactive Ruby Shell is a REPL.

def chat(input)
  begin
    eval(input)
  rescue Exception => e
    e.message
  end
end

とりあえずうまくいったのだけど、なぜかローカル変数を定義できないので他のirbの実装を眺めてみた。

pictruby-irb-02.png

web-irb

http://joshnuss.github.io/mruby-web-irb/

>> a = [1, 2, 3]
=>[1, 2, 3]
=>NoMethodError: undefined method 'a' for main

同じ現象が起きている!

>> @a = [1, 2, 3]
>> @a
=>[1, 2, 3]

メンバ変数として定義するとちゃんと保持される。

mirbiosでLINE風味にIRBできるようにする

次のバージョンのPictRubyでチャット風インターフェースを作れるようにしたのでirbを実装した。

pictruby-irb-01.png

コードは以下のような感じに。エラーハンドリングはさすがにObjective-C側に書かないとダメかなと思ったいたのだけど、例外キャッチするだけでうまくいった。Rubyの表現力はやはり高い。

# # 10_irb
#
# ## Description
# Interactive Ruby Shell is a REPL.

def chat(input)
  begin
    eval(input)
  rescue Exception => e
    e.message
  end
end

とりあえずうまくいったのだけど、なぜかローカル変数を定義できないので他のirbの実装を眺めてみた。

pictruby-irb-02.png

web-irb

http://joshnuss.github.io/mruby-web-irb/

>> a = [1, 2, 3]
=>[1, 2, 3]
=>NoMethodError: undefined method 'a' for main

同じ現象が起きている!

>> @a = [1, 2, 3]
>> @a
=>[1, 2, 3]

メンバ変数として定義するとちゃんと保持される。

mirb

mruby標準添付のやつ

$ git clone https://github.com/mruby/mruby.git
$ rake
$ ./bin/mirb 
mirb - Embeddable Interactive Ruby Shell

> a = 1
a = 1
 => 1
> a
a
 => 1

mirbはちゃんとローカル変数が使えるようだ。何か実際に違いがあるのかも。(そのうちソース読もう)

まとめ

ともあれweb-irbは同じだったのでちょっと安心した(なにが)。メンバ変数を使うという逃げ道も見つかったのでとりあえず実装優先で進める。

mruby標準添付のやつ

$ git clone https://github.com/mruby/mruby.git
$ rake
$ ./bin/mirb 
mirb - Embeddable Interactive Ruby Shell

> a = 1
a = 1
 => 1
> a
a
 => 1

mirbはちゃんとローカル変数が使えるようだ。何か実際に違いがあるのかも。(そのうちソース読もう)

まとめ

ともあれweb-irbは同じだったのでちょっと安心した(なにが)。メンバ変数を使うという逃げ道も見つかったのでとりあえず実装優先で進める。