逆変換に用いられる関数の使い方を簡単に上げておきます。 間違っていたり、無いものがありますが許してください。
converter.registerCallMethod(
インスタンス名,
メソッド名,
引数の数,
(params) => {}
);
基本的なブロック(value
, statement
, hat
)が変換できます。
1 つ目の引数は基本的にself
になり、
command.puts
のようなインスタンスメソッドを呼び出す場合はインスタンス名になります。その場合はcommand
となります。
2 つ目の引数は変換するメソッド名です。
3 つ目の引数は変換するメソッドの引数の数です。
確認しきれていません
converter.registerCallMethodWithBlock(
インスタンス名,
メソッド名,
上の引数の数,
下の引数の数, // たぶん
(params) => {}
);
end
がつくブロックを変換可能
3 つ目までの引数はconverter.registerCallMethod
と同じです
4 つ目の引数は end 側につく引数の数?(未確認)
converter.isString(確認する値);
引数が文字列か確認します。
引数には基本的にargs[n]
を入れます。
converter.isNumber(確認する値);
引数が数字か確認します。
引数には基本的にargs[n]
を入れます。
converter.isBlock(確認する値);
不明
名前からしてブロックか確認?
converter.isStringOrBlock(確認する値);
引数が文字列もしくはブロックか確認します。
引数には基本的にargs[n]
を入れます。
converter.isNumberOrBlock(確認する値);
引数が数字もしくはブロックか確認します。
引数には基本的にargs[n]
を入れます。
const block = converter.createBlock(メソッド名, ブロックの形);
変換するブロックを指定します。
1 つ目の引数はruby-generator
側で定義したメソッド名
2 つ目の引数はブロックの形
ブロックの形は以下のようなものがあります
converter.createRubyExpressionBlock(インスタンス名, node);
インスタンス部分を作成するときに用います。
1 つ目の引数はインスタンス名
2 つ目の引数はnode
インスタンス名は以下のような制限があります
- 大文字は使えない(違うかも)
=
、.
、[]
、()
などの記号は使えない
node
はparams
から分割代入します
converter.changeRubyExpressionBlock(receiver, メソッド名, ブロックの形);
インスタンスメソッドを作成するときに用います。
1 つ目の引数はreceiver
2 つ目の引数はメソッド名
3 つ目の引数はブロックの形
receiver
はparams
から分割代入します
メソッド名とブロックの形はcreateBlock
を参照
converter.addTextInput(block, 引数名, 渡す値, デフォルト値?);
ブロックに引数(文字列もしくはブロック)を渡します。
1 つ目の引数は 引数を渡すブロック。基本的にblock
のままで問題ない
2 つ目の引数は vm 側のarguments
で決めた引数名
3 つ目の引数は 実際に渡す値。基本的にはargs[n]
という形になる
4 つ目の引数は 不明。デフォルト値?
converter.addNumberInput(block, 引数名, 'math_number', 渡す値, デフォルト値?);
ブロックに引数(数字もしくはブロック)を渡します。
1 つ目の引数は 引数を渡すブロック。基本的にblock
のままで問題ない
2 つ目の引数は vm 側のarguments
で決めた引数名
3 つ目は不明、math_number
以外見たことない
math_number
- 実数?
math_positive_number
- 正の実数?負の数も渡せるため不明
math_whole_number
- 整数?整数以外も渡せるため不明
math_integer
- 整数?整数以外も渡せるため不明
math_angle
- 0~360(たぶん)
% 360
の処理が掛かる?
- 0~360(たぶん)
4 つ目の引数は 実際に渡す値。基本的にはargs[n]
という形になる
5 つ目の引数は 不明。デフォルト値?
converter.addFieldInput(block, 引数名, gui側メニュー名, vm側メニュー名, 渡す値, デフォルト値?);
ブロックに引数(メニューもしくはブロック)を渡します。
ブロックを引数に持てるタイプのメニューに引数を渡すことが可能です。
1 つ目の引数は 引数を渡すブロック。基本的にblock
のままで問題ない
2 つ目の引数は vm 側のarguments
で決めた引数名
3 つ目の引数は gui 側で定義したメニューの名前
4 つ目の引数は vm 側のmenus
で定義したメニュー名
4 つ目の引数は 実際に渡す値。基本的にはargs[n]
という形になる
5 つ目の引数は 不明。デフォルト値?
converter.addFieldInput(
block,
"COLOR",
"colour_picker",
"COLOUR",
args[0],
"#43066f"
);
2 つ目の引数は vm 側で定義した変数の名前
3 つ目の引数は colour_picker
固定
4 つ目の引数は COLOUR
固定?
5 つ目の引数は実際に渡す値
6 つ目の引数は不明、デフォルト値?
converter.addField(block, 引数名, 渡す値, デフォルト値?);
ブロックに引数(メニュー)を渡します。
ブロックを引数に持てないタイプのメニューに引数を渡すことが可能です。
1 つ目の引数は 引数を渡すブロック。基本的にblock
のままで問題ない
2 つ目の引数は vm 側のarguments
で決めた引数名
3 つ目の引数は 実際に渡す値。基本的にはargs[n]
という形になる
4 つ目の引数は 不明。デフォルト値? なくても問題ない
converter.addInput(block, 引数名, 渡す値, デフォルト値?);
不明
ドキュメントがないため一部はBlocklyのドキュメントを参考に書いています。
Generator.prepares_[`適当な名前`] = Generator.別の定義;
定義した別関数を呼び出すことができます。
prepares_["適当な名前"]
は block->Ruby に変換した際 1 度だけ呼び出されます。
Generator.valueToCode(block, 引数名, 評価順?);
ブロックから引数を取得することができます。
1 つ目の引数は 引数を取得するブロック。基本的にblock
のままで問題ない
2 つ目の引数は vm 側のarguments
で決めた引数名
3 つ目の引数は 評価順的なもの?。基本的にはORDER_ATOMIC
,ORDER_NONE
を使う。
評価順?のマジックナンバー
基本的に上から順番に評価順が高い
- 0 "" ...
- 一番初めに評価される
return ["value0", Generator.ORDER_ATOMIC];
基本的に値ブロックはこの変数を使う。
返す文字列にかっこを含む(メソッド)を返す場合はORDER_FUNCTION_CALL
を使う。
- tuples, lists, dictionaries
- scratch の list にのみ使われている
- `expression...`
- 使われていないので不明
- ::
- 使われていないため不明
- []
- 配列の要素
- +(単項) ! ~
- 否定演算子などに使われる?
- **
- 使われていないため不明
- -(単項)
- 使われていないため不明
- * / %
- 積,商,余り
- + -
- 和,差
- << >>
- 使われていないため不明
- ビット操作?
- &
- 使われていないため不明
- ビット操作?
- ^
- 使われていないため不明
- ビット操作?
- |
- 使われていないため不明
- ビット操作?
- > >= < <=
- 比較
- <=> == === != =~ !~
- 比較
- &&
- かつ
- ||
- または
- .. ...
- range
- ?:(条件演算子)
- 使われていないため不明
- 三項演算子?
- =(+=, -= ... )
- 使われていないため不明
- 代入演算子?
- not
- 使われていないため不明
- and or
- 使われていないため不明
- (...)
- 通常ブロックの形でメソッドを呼び出す際に使う
Generator.sample_command1 = function (block) {
const text =
Generator.valueToCode(block, "TEXT", Generator.ORDER_NONE) || null;
const num = Generator.valueToCode(block, "NUM", Generator.ORDER_NONE) || 0;
return `puts(command1, ${text}, ${num})\n`;
};