添加 API 对 JS 解释器的调用以与自定义块一起使用
Adding API call to JS-interpreter for use with custom blockly block
我想先声明我是 JavaScript 的新手,而且肯定是使用 Neil Fraser JS-interpreter。
我制作了一些自定义块,它们只是创建 JavaScript 当 eval() 将其块类型的对象和用户输入放入数组时。
他们用来执行此操作的函数称为 pushInstruction(blockName, inputs);
其中 inputs 是用户输入的块数组,blockName 是块的名称。
现在我正在尝试使用 JS 解释器,但问题在于我如何使用这些块。
我迫切需要帮助,而且我这辈子都找不到任何资源来帮助我。可能有点傻。
自定义块代码
Blockly.Blocks['select_hand_position'] = {
init: function() {
this.appendDummyInput()
.appendField("Move");
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([["left hand","Left hand"], ["right hand","Right hand"]]), "handSelect")
.appendField("to index")
.appendField(new Blockly.FieldNumber(0), "indexSelect");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.JavaScript['select_hand_position'] = function(block) {
var dropdown_handselect = block.getFieldValue('handSelect');
var number_indexselect = block.getFieldValue('indexSelect');
var input = '["'+dropdown_handselect+'",'+number_indexselect+']';
var code = 'pushInstruction("select_hand_position",'+input+');'
return code;
};
我有一个全局数组来保存对象
instructionStructure = new Array();
然后在这个函数中使用,其中块生成代码要使用的那个。
function pushInstruction(blockName,inputs) {
var instruction = null;
switch(blockName) {
case "place_book":
case "grab_book":
case "select_hand_position":
instruction = {
blockName: blockName,
hand: inputs[0],
index: inputs[1].toString()
};
instructionStructure.push(instruction);
break;
default:
throw 'attempted to push unknown instruction block';
}
}
步骤代码
这是 运行 按下步骤按钮后的代码
function stepCode() {
Blockly.JavaScript.STATEMENT_PREFIX = 'highlightBlock(%1);\n';
Blockly.JavaScript.addReservedWords('highlightBlock');
var code = Blockly.JavaScript.workspaceToCode(workspace);
var myInterpreter = new Interpreter(code, initApi);
function nextStep() {
if (myInterpreter.step()) {
window.setTimeout(nextStep, 1000);
}
}
nextStep();
alert(instructionStructure);
}
初始化API函数
这是我不断得到
Uncaught TypeError: Interpreter.setProperty is not a function
上线
Interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
function initApi(interpreter, scope) {
var wrapper = function(id) {
id = id ? id.toString() : '';
return interpreter.createPrimitive(highlightBlock(id));
};
interpreter.setProperty(scope, 'highlightBlock',
interpreter.createNativeFunction(wrapper));
wrapper = function(blockName, inputs) {
return pushInstruction(blockName,inputs);
};
Interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
}
感谢您花时间阅读本文,非常感谢!
你这里有错字:
Interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
=>
interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
这是 Uncaught TypeError
的。
这是唯一的问题吗?因为我真的不懂
but the problem is with how I go about using these blocks with it.
我想先声明我是 JavaScript 的新手,而且肯定是使用 Neil Fraser JS-interpreter。
我制作了一些自定义块,它们只是创建 JavaScript 当 eval() 将其块类型的对象和用户输入放入数组时。
他们用来执行此操作的函数称为 pushInstruction(blockName, inputs); 其中 inputs 是用户输入的块数组,blockName 是块的名称。
现在我正在尝试使用 JS 解释器,但问题在于我如何使用这些块。
我迫切需要帮助,而且我这辈子都找不到任何资源来帮助我。可能有点傻。
自定义块代码
Blockly.Blocks['select_hand_position'] = {
init: function() {
this.appendDummyInput()
.appendField("Move");
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([["left hand","Left hand"], ["right hand","Right hand"]]), "handSelect")
.appendField("to index")
.appendField(new Blockly.FieldNumber(0), "indexSelect");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.JavaScript['select_hand_position'] = function(block) {
var dropdown_handselect = block.getFieldValue('handSelect');
var number_indexselect = block.getFieldValue('indexSelect');
var input = '["'+dropdown_handselect+'",'+number_indexselect+']';
var code = 'pushInstruction("select_hand_position",'+input+');'
return code;
};
我有一个全局数组来保存对象
instructionStructure = new Array();
然后在这个函数中使用,其中块生成代码要使用的那个。
function pushInstruction(blockName,inputs) {
var instruction = null;
switch(blockName) {
case "place_book":
case "grab_book":
case "select_hand_position":
instruction = {
blockName: blockName,
hand: inputs[0],
index: inputs[1].toString()
};
instructionStructure.push(instruction);
break;
default:
throw 'attempted to push unknown instruction block';
}
}
步骤代码
这是 运行 按下步骤按钮后的代码
function stepCode() {
Blockly.JavaScript.STATEMENT_PREFIX = 'highlightBlock(%1);\n';
Blockly.JavaScript.addReservedWords('highlightBlock');
var code = Blockly.JavaScript.workspaceToCode(workspace);
var myInterpreter = new Interpreter(code, initApi);
function nextStep() {
if (myInterpreter.step()) {
window.setTimeout(nextStep, 1000);
}
}
nextStep();
alert(instructionStructure);
}
初始化API函数
这是我不断得到
Uncaught TypeError: Interpreter.setProperty is not a function
上线
Interpreter.setProperty(scope, 'pushInstruction', interpreter.createNativeFunction(wrapper));
function initApi(interpreter, scope) {
var wrapper = function(id) {
id = id ? id.toString() : '';
return interpreter.createPrimitive(highlightBlock(id));
};
interpreter.setProperty(scope, 'highlightBlock',
interpreter.createNativeFunction(wrapper));
wrapper = function(blockName, inputs) {
return pushInstruction(blockName,inputs);
};
Interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
}
感谢您花时间阅读本文,非常感谢!
你这里有错字:
Interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
=>
interpreter.setProperty(scope, 'pushInstruction',
interpreter.createNativeFunction(wrapper));
这是 Uncaught TypeError
的。
这是唯一的问题吗?因为我真的不懂
but the problem is with how I go about using these blocks with it.