Вложение пользовательских блоков Blockly в циклы и генерация кода

Я новичок в блочном, и я играю с созданием пользовательских блоков.

Я создал новый файл (move.js) в папке блоков и создал там несколько пользовательских блоков. Все они имеют схожую структуру, как показано ниже.

Blockly.Blocks['move_forward'] = {
  init: function() {
    this.appendDummyInput()
        .appendField("Move Forward");
    this.appendDummyInput()
        .appendField(new Blockly.FieldImage("http://iosites.org/robotino/front.png", 20, 20, "Forward"));
    this.setInputsInline(true);
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(120);
    this.setTooltip('');
    this.setHelpUrl('http://www.example.com/');
  }
};

Затем я создал новый файл (move.js) в папке генераторов/javascript и написал там очень простые генераторы для блоков (они возвращают только букву).

Blockly.JavaScript['move_forward'] = function(block) {
  return ['F;'];
};

Блоки работают нормально и возвращают текст, который они должны отображать при размещении вне циклов. Но когда я вставляю их в цикл повторения или цикла while, что-то происходит, и ничего не возвращается. Я провел некоторое тестирование и думаю, что проблема возникает, когда

Blockly.JavaScript.statementToCode

вызывается внутри генератора повторов для моих пользовательских блоков.


person Giannis    schedule 15.09.2016    source источник


Ответы (1)


Трудно сказать, но генераторы обычно возвращают либо

return code + '\n';

or

return [code, Blockly.JavaScript.ORDER_ATOMIC];

на основе блока (если он что-то возвращает или просто что-то делает). Вы генерируете (и возвращаете) массив без порядка (вместо просто return 'F;';)... не уверен, но, возможно, это вызывает проблему.

person Tom    schedule 19.11.2016
comment
Да, у меня сработало удаление квадратных скобок. До этого мой код генерировался нормально для отдельных блоков, но при сложении, например. в цикле я бы получил строку запятых в конце и синтаксическую ошибку. - person Mike Redrobe; 24.05.2018