💎

StateGoでRubyもビジュアルプログラミング~

2020/11/06に公開

(※本記事は2020/7/17にQrunch(閉鎖)にて公開したものを加筆修正したものです)

はじめに

コードミックス・ビジュアルプログラミングStateGoを使い、Rubyのビジュアルプログラミング化に挑戦した時の記録です。

StateGoを知らない方へ

私が3年前より開発を進めているツールで、もともとは脱出ゲーム用のツールでした。
アイデアを得て、様々なプログラミング言語、様々なプラットフォーム、様々なフレームワークで利用できるようにしたものです。

詳しくはこちらを参照下さい。

環境

Windows 10
Ruby(Ruby+Devkit 2.6.6-1 (x64))
StateGo

サンプルの取得

サンプルは Githubより取得してください。
https://github.com/NNNIC/psgg-ruby-sample

実行

StateGoでサンプルのステートマシンを確認し、ソースへコンバート⇒実行します。
※詳細は、この次の項目で説明します。

1. StateGoで sample/TestControl.psggを開く

Githubから psgg-ruby-sample をクローンまたはDLして、sampleフォルダのTestControl.psggを開きます。

2. "保存と変換"を押して TestControl.rbを更新

StateGoの左下のパネルにボタンがあります。

3. rubyを実行

ruby Test.rb

サンプルの説明

前提となるStateGoの簡単な説明

StateGoはフロー型のビジュアルプログラミングで、一般のビジュアルプログラミングと大きく違い”命令を直接代入する”という特徴を持ちます。
命令を直打ちするから当たり前なのですが、用途に制限なく、自由に組むことができるビジュアルプログラミングツールです。

サンプルでやってること

定番の Hello World

initアイテムは、ステート関数実行時初回のみ実行されるコードを指定します。
ここに、puts("Hello World") が入力されています。

このステートは以下のステート関数へ変換されます。

※ステート関数については、こちらを参照下さい。

本ステートのみを実行した結果は以下の通りです。

組込ステートで固定メッセージを定義して、表示する

① E_0001について
下図のE_0001ステートは組込ステートと呼びます。

embedアイテムに TITLE="Ruby Sample using StateGo."が入力されています。

embedアイテムに入力した命令は、変換されることなく、出力されます。

② HELLOWORLD1について
下図のようにHELLOWORLD1には、puts(TITLE)が入力されています。

※出力ソースは先のHELLOWORLDと似たものになるので割愛します。

HELLOWORLD1だけを実行した結果は以下の通りです。

サブルーチン呼び出し

サブルーチンは"サブルーチン開始"ステートで始まり"サブルーチン終了(リターン)"ステートで終わります。そのサブルーチンは、サブルーチン呼出しステートから呼ばれます。

SUBROUTINEステートにてputs('This is the subroutine.' )が入力されています。

サブルーチンだけの実行結果は以下の通りです。

繰り返し処理

くり返し処理は、サブルーチンを呼出します。

loop_initに @m_index = 0
loop_condに @m_index < 10
loop_nextに @m_index += 1
が入力されています。

結果、10回ループします。

分岐処理

分岐編集にて、プログラムのそのままに条件が入力されています。

本部分の変換ソースは以下の通りです。

変換結果の挿入

本サンプルはTestControl.rbの[STATEGO OUTPUT START][STATEGO OUTPUT END]の間に変換結果を出力します。

フィルタ

挿入するステートを何にするか、フィルタを設定することで制御することができます。
フィルターは正規表現です。
下図は、組込用のステート(E_XXXX)が指定され、展開されます。

変換以外の部分について

変換以外の部分はエディタで自由に編集することができます。
つまり、ステートマシン内で使用するメンバやメソッドをここで定義することができます。

Test.rb

Test.rbからTestControl.rbを呼出し実行します。
ソースは以下の通りです。

# Test.rb
require_relative 'TestControl'
sm = TestControl.new
sm.run()

実行結果

実行結果は以下のようになります。

最後に

Rubyでの実装内容を詳細に解説してみました。
興味を持って頂ければ幸いです。

サンプル
StateGo

参考

RubyをWindowsでインストールする方法【初心者向け】
【Ruby入門】require(_relative)で外部ファイルを読み込もう!
Ruby の case 文
Let'sプログラミング:複数の条件分岐(if...elsif...else...end)
Let'sプログラミング:起算時からの経過秒数を取得する
【Ruby入門】randomを使いこなす!【数値、文字列、array、secure】
Ruby/メソッドポインタ(関数ポインタ)を使う方法
ステート処理はナァラティブに


(イラスト TAJIBON)

Discussion