概要(Epic #738 / DoD で発覚)
Ruby v1 で、リスト要素の読み出しが 配列記法 $名前[N] で生成されるが、v1 のコンバータは
配列記法を拒否するため、Ruby タブ → コードタブのラウンドトリップが壊れる。
再現(v1 の koshien AI)
「AIを試す」用に作った v1 koshien AI で、リスト要素を読むと:
koshien.connect_game(name: "player1")
loop do
koshien.get_map_area(koshien.player)
koshien.calc_route(result: list("$最短経路"))
koshien.move_to($最短経路[1]) # ← v1 なのに配列記法で生成される(バグ)
koshien.turn_over
end
この状態で Ruby タブ → コードタブに切り替えると、次のエラーで変換できない:
配列の書き方はルビーバージョン2でのみ使えます。
設定メニューからルビーバージョン2に切り替えるか、
list()の書き方を使ってください。
→ v1 では list("$最短経路")[2](List 記法・1 始まり)が期待値。
根本原因
packages/scratch-gui/src/lib/ruby-generator/data-list.js の data_itemoflist に
バージョン分岐が無い:
const index = getListIndex(block); // 1始まり→0始まり (N-1)
const list = getListName(block); // "$最短経路"
return [`${list}[${index}]`, Generator.ORDER_FUNCTION_CALL]; // 常に配列記法
v1/v2 を問わず $名前[N](配列記法・0 始まり)を出力している。koshien.js の koshienListArg
は result 引数で既に v1=list("$名前") / v2=$名前 の分岐を持つが、リスト要素読み出し
(および他の添字操作)には同等の分岐が無い。
あるべき挙動
- v1:
list("$名前")[scratchIndex](1 始まり)
- v2:
$名前[rubyIndex](0 始まり・現状維持)
やること
data_itemoflist をバージョン分岐させる(v1 = list("$名前")[1始まりindex]、v2 = 現状)。
- 他の添字を取る/壊すリスト操作も監査して同様に修正(v1 で配列記法を出すものは全て):
data_replaceitemoflist($名前[i] = v)
data_insertatlist($名前.insert(i, v))
data_deleteoflist($名前.delete_at(i))
data_addtolist($名前.push(v))/ data_lengthoflist(.length)等、List ラッパーで
表現すべきものが v1 で配列メソッド呼び出しになっていないか確認
- v1 の round-trip(Ruby → blocks → Ruby)で
list("$名前")[...] 記法が保たれること。
受け入れ条件
ベースブランチ
関連
Epic #738 / #743(Ruby v2 対応)/ #827(AIを試す 出力)/ #763・#764(ゲームサーバー)
DoD(実エディタ v1 で「AIを試す」)で発覚。
概要(Epic #738 / DoD で発覚)
Ruby v1 で、リスト要素の読み出しが 配列記法
$名前[N]で生成されるが、v1 のコンバータは配列記法を拒否するため、Ruby タブ → コードタブのラウンドトリップが壊れる。
再現(v1 の koshien AI)
「AIを試す」用に作った v1 koshien AI で、リスト要素を読むと:
この状態で Ruby タブ → コードタブに切り替えると、次のエラーで変換できない:
→ v1 では
list("$最短経路")[2](List 記法・1 始まり)が期待値。根本原因
packages/scratch-gui/src/lib/ruby-generator/data-list.jsのdata_itemoflistにバージョン分岐が無い:
v1/v2 を問わず
$名前[N](配列記法・0 始まり)を出力している。koshien.jsのkoshienListArgは result 引数で既に v1=
list("$名前")/ v2=$名前の分岐を持つが、リスト要素読み出し(および他の添字操作)には同等の分岐が無い。
あるべき挙動
list("$名前")[scratchIndex](1 始まり)$名前[rubyIndex](0 始まり・現状維持)やること
data_itemoflistをバージョン分岐させる(v1 =list("$名前")[1始まりindex]、v2 = 現状)。data_replaceitemoflist($名前[i] = v)data_insertatlist($名前.insert(i, v))data_deleteoflist($名前.delete_at(i))data_addtolist($名前.push(v))/data_lengthoflist(.length)等、List ラッパーで表現すべきものが v1 で配列メソッド呼び出しになっていないか確認
list("$名前")[...]記法が保たれること。受け入れ条件
list("$名前")[1始まりindex]で生成される$名前[0始まり])のまま変わらないtest/unit/lib/ruby-roundtrip/等にユニットテスト追加(v1/v2 双方)ベースブランチ
topic/koshien-epic-738(Epic feat: スモウルビー甲子園 拡張機能の本格対応(ブロック挙動 + 実サーバー通信)[Epic] #738 の一部)関連
Epic #738 / #743(Ruby v2 対応)/ #827(AIを試す 出力)/ #763・#764(ゲームサーバー)
DoD(実エディタ v1 で「AIを試す」)で発覚。