mrubyとCRubyの非互換とその対応方法

  • 11
    いいね
  • 0
    コメント

(メモ。詳しくはあとで追記するかも。)

"foo" "bar" の文字列連結ができない

"foo" + "bar" を使う。

defined?(Foo)がエラーになる

const_defined?(:Foo)を使う。

mrubyにdefined?(Foo)が実装されていない理由は、Fooが未定義でもエラーにさせないために特殊な実行が行われており、それを嫌ったためだったはず。

:"foo#{a}bar#{b}"形式のSymbol定義がエラーになる

"foo#{a}bar#{b}".to_symを使う。

$:等の変数がない

$LOAD_PATH等はあったりするのでこちらを使う。

RUBY_PATCHLEVEL等の定数がない

適当に定義して回避する?

なお、2016年現在のmrubyにはパッチレベルの概念がない。github:mruby/mrubyのmasterとmruby forumのリリース版のみ。

RbConfigがない

同上。

なお、mrubyはクロス開発もごく自然に行われるため、ビルド時のOSの情報とかは役に立たないことがあるのに注意。

IOがない

github:iij/mruby-ioを使う。

Dirがない

github:iij/mruby-dirを使う。

Dir.glob は github:gromnitsky/mruby-dir-glob を使う。

tmpdirがない

github:iij/mruby-tempfileを使う。

requireがない

github:iij/mruby-requireを使う。

ENVがない

github:iij/mruby-envを使う。

Regexpがない

github:iij/mruby-regexp-pcreやgithub:mattn/mruby-onig-regexpを使う。

Iconvがない

github:mattn/mruby-iconvを使う。

fileutils.rb、pp.rb等がない

fileutilsに関してはgithub:gromnitsky/mruby-fileutils-simple があったりする(実装は力技ですごい)のでこの辺を使ったりする。

pp.rbの代わりは書いた -> https://github.com/takahashim/mruby-pp

https://github.com/kou/mruby-pp もある。

Kernel#execがない

Kernel#systemならgithub:iij/mruby-processにあったりするのでこちらでもよければこれを使う。

あと、github:haconiwa/mruby-execがある(動作未確認)。

at_exitがない

github:ksss/mruby-at_exit を使う。

mruby本家にat_exitがない理由については http://ksss9.hatenablog.com/entry/2016/08/19/224631 を参照。そもそもインタプリタの実行終了とプロセスの終了が一致するCRubyと、インタプリタが終了してもプロセスが終了するとは限らないmrubyでat_exitをどう揃えるべきか、という問題がある。なお、ISO Rubyではat_exitは定義されていない。

File.executable?がない

github:iij/mruby-io にあるかと思ったらなかった。自力でなんとかすべきか。

executable?はOSに依存する概念なのでいろいろめんどくさい、という難点がある。

その他いろいろ動かないものがある

(自力で直せそうなら修正してpull requestをする→一部した)