Ruby ソースコード Scratch ブロック
───────────────── ──────────────────
(パーザーが自動管理) グローバルリスト $_symbols_ = [":foo", ":bar", ":baz"]
(プロジェクトファイルに永続化)
:foo (値として参照) ←→ data_itemnumoflist(LIST=$_symbols_, ITEM=":foo")
+ comment: @ruby:symbol:foo
:foo.to_s ←→ operator_join(STRING1="foo", STRING2="")
+ comment: @ruby:symbol:foo
say(:foo) ←→ looks_say(MESSAGE="foo")
+ comment: @ruby:symbol:foo
x = :foo ←→ data_setvariableto(x, data_itemnumoflist(...))
variable dataType: 'symbol'
:foo == :bar ←→ operator_equals(
data_itemnumoflist(":foo"),
data_itemnumoflist(":bar"))
→ 整数比較(高速)
Goal
Ruby のシンボルリテラル
:symbolを Smalruby で扱えるようにする。シンボルはグローバルリスト$_symbols_で管理し、data_itemnumoflistブロックでインデックスを参照することで高速な比較を実現する。教育的観点から、.to_sなしでは文字列として使えないことを明示する(say/puts/p/printは例外として暗黙変換)。アーキテクチャ概要
設計判断(確定事項)
$_symbols_の永続化動作一覧
:foo(値として)data_itemnumoflist(LIST=$_symbols_, ITEM=":foo")+@ruby:symbol:foo:foo.to_soperator_join("foo", "")+@ruby:symbol:foosay(:foo)looks_say(MESSAGE="foo")+@ruby:symbol:fooputs(:foo)/p(:foo)/print(:foo)x = :foodata_setvariableto(x, itemnumoflist)dataType='symbol':foo == :baroperator_equals(index, index)move(:foo)等self.when(:flag_clicked):fooシンボル「foo」$_symbols_ = [:foo, :bar, :baz]を出力Affected Files
Ruby → Blocks(コンバーター)
packages/scratch-gui/src/lib/ruby-to-blocks-converter/index.js— シンボル収集、$_symbols_リスト作成、エラーメッセージpackages/scratch-gui/src/lib/ruby-to-blocks-converter/ast-handlers/expressions.js—visitSymbolNode拡張packages/scratch-gui/src/lib/ruby-to-blocks-converter/operators.js—.to_sにシンボルレシーバ追加packages/scratch-gui/src/lib/ruby-to-blocks-converter/looks.js—sayでシンボル引数の暗黙変換packages/scratch-gui/src/lib/ruby-to-blocks-converter/variables.js— 変数代入時の symbol dataTypepackages/scratch-gui/src/lib/ruby-to-blocks-converter/node-utils.js— シンボル関連ユーティリティ拡張packages/scratch-gui/src/lib/ruby-to-blocks-converter/variable-utils.js—$_symbols_リスト管理Blocks → Ruby(ジェネレーター)
packages/scratch-gui/src/lib/ruby-generator/data.js—data_itemnumoflist+@ruby:symbol→:foo出力packages/scratch-gui/src/lib/ruby-generator/looks.js—say+@ruby:symbol→say(:foo)出力packages/scratch-gui/src/lib/ruby-generator/code-finisher.js—$_symbols_ = [...]出力ロケール
packages/scratch-gui/src/locales/ja.js— エラーメッセージpackages/scratch-gui/src/locales/ja-Hira.js— エラーメッセージ(ひらがな)ふりがな
packages/scratch-gui/src/lib/furigana-node-handlers.js—_handleSymbolNode追加Implementation Steps
$_symbols_リスト管理基盤 — パーザー内でシンボル収集、Stage 上にグローバルリスト作成data_itemnumoflistブロック —visitSymbolNode拡張、@ruby:symbol:fooコメント付与:symbol.to_sサポート —operators.jsに'symbol'レシーバ追加say/puts/p/printでシンボル暗黙変換 — 各ハンドラでシンボル引数の暗黙文字列変換symbolNeedsToSエラー追加、ロケール追加@ruby:symbolコメント検出、シンボルリテラル・$_symbols_出力_handleSymbolNodeでシンボル「foo」表示$_symbols_管理、エラーケースDefinition of Done
:foo.to_sを Ruby タブで入力 → エラーなしで変換、ブロック表示されるsay(:foo, 2)→ 正常にブロック変換、スプライトが「foo」と表示x = :foo→data_itemnumoflistブロックで変数にインデックス格納:foo == :bar→operator_equalsで比較ブロック生成move(:foo)→ 「.to_s を付けてください」エラーメッセージ表示:foo単独 → エラーメッセージ表示self.when(:flag_clicked)→ 既存動作が壊れていない:fooリテラルが正しく出力される$_symbols_ = [:foo, :bar, :baz]が出力される:fooにふりがなシンボル「foo」が表示されるTest Plan
$_symbols_管理