如何在 Blockly 中从 input_statement 获取语句堆栈?
How to get statement stack from input_statement in Blockly?
这就是有问题的块
Screenshot
{
"type": "local",
"message0": "%{BKY_LOCAL_TITLE}",
"args0": [
{
"type": "input_dummy"
},
{
"type": "input_statement",
"name": "DEFINE",
"check": "Local"
},
{
"type": "input_value",
"name": "EXPRESSION"
}
],
"inputsInline": true,
"output": null,
"style":"local_blocks"
}
用于函数的局部定义。
'Define' arg 包含许多函数和变量定义块。问题是,如果我尝试访问定义,无论我做什么,我都只能获得堆栈中的第一个块。
我试过直接用statementToCode和BlockToCode调用它
Blockly.JavaScript.valueToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL) ;
Blockly.JavaScript.statementToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL);
Blockly.JavaScript.blockToCode(block.getInputTargetBlock('DEFINE')); //neither works
我尝试做一个 for 循环,但 DEFINE0、DEFINE1 等不存在。
那么,您实际上是如何让块堆叠在 DEFINE 字段中的呢?
编辑:我检查了 block.getChildren().length 并且它始终为 2(所以表达式 + 定义)这意味着,正如预期的那样,定义列表嵌套在第一个子项中。
另一个问题可能是定义列表是函数定义,即它们生成如下代码:
Blockly.JavaScript['define_name'] = function(block) {
[...]
Blockly.JavaScript.definitions_['%' + name] = code;
return null;
};
这意味着它们没有 return 值。但我仍然应该能够调用它们。当我确实使用 statementToCode 或类似的东西时,我确实得到了第一个定义(在图像函数本地定义中),但没有得到其余的定义。我交换了它们,它始终是第一个生成代码的。
所以我真的不明白这个问题。在其他例子中,他们几乎什么都不做,只是
var branch = Blockly.JavaScript.statementToCode(block, 'STACK');
为什么这在这里不起作用?
只为未来的考古学家:
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks);
}while (define_blocks = define_blocks.getNextBlock());
对于想知道为什么 blockToCode returns 重复代码的每个人 - 将 true 传递给 blockToCode 方法
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks, true);
}while (define_blocks = define_blocks.getNextBlock());
这就是有问题的块
Screenshot
{
"type": "local",
"message0": "%{BKY_LOCAL_TITLE}",
"args0": [
{
"type": "input_dummy"
},
{
"type": "input_statement",
"name": "DEFINE",
"check": "Local"
},
{
"type": "input_value",
"name": "EXPRESSION"
}
],
"inputsInline": true,
"output": null,
"style":"local_blocks"
}
用于函数的局部定义。
'Define' arg 包含许多函数和变量定义块。问题是,如果我尝试访问定义,无论我做什么,我都只能获得堆栈中的第一个块。
我试过直接用statementToCode和BlockToCode调用它
Blockly.JavaScript.valueToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL) ;
Blockly.JavaScript.statementToCode(block, 'DEFINE', Blockly.JavaScript.ORDER_FUNCTION_CALL);
Blockly.JavaScript.blockToCode(block.getInputTargetBlock('DEFINE')); //neither works
我尝试做一个 for 循环,但 DEFINE0、DEFINE1 等不存在。
那么,您实际上是如何让块堆叠在 DEFINE 字段中的呢?
编辑:我检查了 block.getChildren().length 并且它始终为 2(所以表达式 + 定义)这意味着,正如预期的那样,定义列表嵌套在第一个子项中。
另一个问题可能是定义列表是函数定义,即它们生成如下代码:
Blockly.JavaScript['define_name'] = function(block) {
[...]
Blockly.JavaScript.definitions_['%' + name] = code;
return null;
};
这意味着它们没有 return 值。但我仍然应该能够调用它们。当我确实使用 statementToCode 或类似的东西时,我确实得到了第一个定义(在图像函数本地定义中),但没有得到其余的定义。我交换了它们,它始终是第一个生成代码的。
所以我真的不明白这个问题。在其他例子中,他们几乎什么都不做,只是
var branch = Blockly.JavaScript.statementToCode(block, 'STACK');
为什么这在这里不起作用?
只为未来的考古学家:
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks);
}while (define_blocks = define_blocks.getNextBlock());
对于想知道为什么 blockToCode returns 重复代码的每个人 - 将 true 传递给 blockToCode 方法
var define_blocks = block.getInputTargetBlock('DEFINE');
if(define_blocks)
do{
Blockly.JavaScript.blockToCode(define_blocks, true);
}while (define_blocks = define_blocks.getNextBlock());