Skip to content

Language

Kouji Takao edited this page Jan 12, 2026 · 1 revision

Smalruby 言語仕様

Smalruby は Ruby のサブセット言語であり、Scratch 3.0 のブロックプログラミングと 1 対 1 で対応するように設計されています。実行時には Opal を用いて JavaScript に変換されますが、エディタ上ではブロックと相互に変換可能な Ruby コードとして扱われます。

予約語

以下の Ruby 予約語が字句解析の対象となります(ただし、すべての予約語が特定のブロックに対応しているわけではありません)。

begin, break, case, class, def, else, elsif, end, ensure, false, for, if, in, module, next, nil, not, or, redo, rescue, retry, return, self, super, then, true, undef, unless, until, when, while, yield

構文 (Control Structures)

条件分岐

ブロックの「もし〜なら」「もし〜なら〜でなければ」に対応します。

if 条件
  # 処理
end

if 条件
  # 処理1
else
  # 処理2
end

繰り返し

ブロックの「ずっと」「〜回繰り返す」「〜まで繰り返す」に対応します。

# ずっと
loop do
  # 処理
end

# 指定回数繰り返す (2通りの書き方)
repeat(10) do
  # 処理
end

10.times do
  # 処理
end

# 〜まで繰り返す
until 条件
  # 処理
end

メソッド定義 (My Blocks)

Scratch の「定義」ブロックに対応します。

def メソッド名(引数1, 引数2)
  # 処理
end

式と型 (Expressions and Types)

Smalruby では以下の基本型を扱います。

  • 数値 (Integer, Float): 10, 3.14
  • 文字列 (String): "Hello", 'World'
  • 真偽値 (Boolean): true, false
  • 配列 (Array): [1, 2, 3] (リストブロックに対応)
  • 範囲 (Range): 1..10 (乱数生成などに使用)
  • Nil: nil

演算子

ブロックの「演算」カテゴリの各ブロックに対応します。

演算子 内容 対応ブロック
+, -, *, /, % 四則演算・余り () + (), () - (), etc.
>, <, == 比較 () > (), () < (), () = ()
&&, ` , !`

変数 (Variables)

変数の種類(スコープ)は接頭辞で区別されます。

  • ローカル変数: name (メソッド内やブロック内でのみ有効、Rubyレベルの変数)
  • インスタンス変数: @name (「このスプライトのみ」の変数)
  • グローバル変数: $name (「すべてのスプライト用」の変数)

主要なメソッド

Smalruby のメソッドは、多くの場合 Scratch のブロックに対応する命令です。

動き (Motion)

  • move(10)
  • turn_right(15), turn_left(15)
  • go_to("mouse"), go_to([0, 0])
  • self.x = 0, self.y = 0
  • self.direction = 90

見た目 (Looks)

  • say("こんにちは"), think("うーん")
  • switch_costume("costume1")

next_costume

  • show, hide

調べる (Sensing)

  • touching?("mouse")
  • key_pressed?("space")
  • mouse_x, mouse_y
  • answer

イベント (Events)

  • when_flag_clicked
  • when_key_pressed("space")
  • when_receive("message1")
  • broadcast("message1")

音 (Sound)

  • play_sound_until_done("meow")
  • stop_all_sounds

特殊な表現

ブロックでは表現できない、または Ruby らしい記述が提供されています。

  • self: 現在のスプライト自身を指します。
  • sprite("スプライト名"): 他のスプライトを参照し、そのプロパティを取得する際に使用します(例: sprite("Sprite1").x)。
  • wait: sleep メソッドと同様に待機します。

注: ここに記載されている仕様は ruby-to-blocks-converter の実装に基づいています。実装されていない Ruby の機能(複雑なクラス定義、メタプログラミングなど)は、ブロックに変換できず ruby_statement として扱われるか、エラーになります。