euremoがeraシリーズの新バリアント開発を目指して試行錯誤したときのメモを書き記しておくものです。
開発にはemueraを使用しています。eramaker/eramaker2には対応しておりません。
最近はeramakerのRuby実装を作ろうとなんやかやしてることのほうが多い気がしてきた。
eratohoJを移植しようとして心が折れた。GOTO多すぎる。TRY系もまだ実装してない。Emuera用バリアントはカラー表示ができたりするので、そういうのも考えるとまだまだ道は遠い。
なんとかGOTOを再現しようと思ったけどいまのRubieraの仕様だと完全に再現するのは無理なので、仕様を大幅に変えてGOTOを書けるようにするか、制限つきのgotoっぽいフロー制御文を書けるようにするか、考えてみて、とりあえず後者で実装した。中身はRubyのcatch〜throw文。eramakerのGOTOは先頭に戻って処理をやり直すループのためのGOTOか、処理をスキップする脱出のためのGOTOの二種類なので、どっちも単にloop文で書ける。Rubyならnextとbreakでいいからね。
$INPUT_LOOP ; 〜なにか処理 SIF ... GOTO INPUT_LOOP
こういうGOTO文は、こう書ける。
loop do # 〜なにか処理 next if ... break end
ただしこんなふうにloop文べた書きにするのは結構大変なので(eramakerのラベル構文の動きを再現するなら、ブロックの最後に必ずbreakを書かなきゃいけないんだけど、忘れると無限ループになる)、loopとcatch〜throwを組み合わせたラッパーメソッドを用意したというわけだ。
label :input_loop do # 〜なにか処理 goto :input_loop if ... end
そこまでやったけど、ラベル構文はブロックと違ってフラットな構造なので、ブロックに書き換えるときにラベルの範囲の終了点をでっちあげなければいけない。でっちあげ、つまり人間が恣意的に決定するしかないので、機械的に変換することができない。そんなわけで手作業で移植しなければならず、さすがに大変なのであきらめた。
というわけでeratohoJはあきらめたんだけど、eratohoAの口上システムは動かせるようになった。近いうちに再配布してもよさそうな口上を同梱したやつをアップする。
いまはeralightをRubiera用に書き直している。単純移植はできてるんだけど、eralightくらいの規模なら、Rubieraらしい書き方のサンプルを作るのにちょうどいいと思って、拡張のベースにしてもいいし処理の参考にしてもいいしという感じ。eratohoAはベースにするのにいいバリアントではあるんだけれど、eramaker時代の名残が結構そこかしこにあって、Rubyの恩恵を受けるには大幅な書き換えが必要になりそう。
あと、ちょっとずつリファレンスの整備もはじめている。
リファレンスでの説明の仕方についてはちょっと試行錯誤してる感じで、今後またちょっと変わるとは思うけど、とりあえず用意してある。
いまはまだエラー表示関係がぜんぜんできてないので、Rubiera.exeだけダウンロードすればバリアント作れるみたいな状況じゃないし、実際手元でもコンソール上で動かして開発している。それでもいいという人向けにRubyの環境を用意してRubiera用のバリアントを作るところまでのチュートリアルも用意したい。ゆくゆくはRubiera.exeがあればyrb書くだけでいいというところを目指すんだけど。
コメントをかく