blockly : переменные кода

Я только что обнаружил «блочный», и это именно то, что я искал, чтобы вывести свое веб-приложение на новый уровень. У меня проблема в том, что я действительно не понимаю, как я могу инициировать переменные кода python или js.

Вот мой блок:

Blockly.Language.myapp_ifdo = {
  helpUrl: '',
  init: function() {
    this.setColour(210);
    this.appendDummyInput()
        .appendTitle("if")
        .appendTitle(new Blockly.FieldDropdown([["Temperature", "Temperature"], ["Humidity", "Humidity"]]), "SENSOR")
        .appendTitle(" ")
        .appendTitle(new Blockly.FieldDropdown([["=", "="], ["≠", "≠"], ["<", "<"], ["≤", "≤"], [">", ">"], ["≥", "≥"]]), "OPERATOR")
        .appendTitle(" ")
        .appendTitle(new Blockly.FieldTextInput("0"), "SENSORVALUE");
    this.appendStatementInput("DO")
        .appendTitle("do");
    this.setInputsInline(true);
    this.setPreviousStatement(true);
    this.setNextStatement(true);
    this.setTooltip('');
  }
};

Рендеринг это:

введите здесь описание изображения

Содержимое выпадающего списка:

введите здесь описание изображения

Что я пытаюсь сделать:

Если выбрана «температура», я хочу инициализировать переменную в начале сгенерированного кода:

temperature = None
if temperature <= '30':
  pass

То же самое, если выбрана «влажность»:

humidity = None
if humidity >= '60':
  pass

В моем файле "template.soy" у меня есть это:

<block type="myapp_ifdo"></block>

Надеюсь, я достаточно ясно... Спасибо за вашу помощь!

С уважением,


person user2196728    schedule 10.09.2013    source источник
comment
Извините за путаницу, но вы просто делаете это, чтобы предотвратить синтаксические ошибки, если переменная окажется необъявленной? Кроме того, blockly имеет встроенные if, операторы равенства и переменные, поэтому вам не нужно создавать свои собственные.   -  person Justin Ethier    schedule 10.09.2013
comment
Я знаю, что у blockly есть встроенный генератор переменных, но я не могу найти способ использовать его в моем случае. В представленных демонстрациях переменные автоматически инициализируются, я просто хочу сделать то же самое, чтобы сгенерировать чистый код!   -  person user2196728    schedule 10.09.2013
comment
Пробовали ли вы запускать Blockly.Generator.workspaceToCode('Python');, как это делает демонстрационное приложение code? Встроенный генератор должен позаботиться о настройке этих объявлений за вас.   -  person Justin Ethier    schedule 10.09.2013
comment
видел это, но не знаю, где это написать в моем коде   -  person user2196728    schedule 10.09.2013
comment
Вы должны иметь возможность вызывать workspaceToCode непосредственно из кода вашего приложения. Как именно это сделать, зависит от вашего приложения, отправляете ли вы код на сервер с помощью AJAX, отображаете его пользователю и т. д.   -  person Justin Ethier    schedule 10.09.2013
comment
К вашему сведению, лучшее место, где можно получить ответы на вопросы о Blockly, — это группа поддержки [группы. google.com/forum/#!forum/blockly], хотя @JustinEthier отлично справился с этой задачей.   -  person Ellen Spertus    schedule 30.11.2013


Ответы (1)


Встроенный генератор Python позаботится об этом за вас, если вы используете встроенные переменные Blockly и другие конструкции.

В демонстрации кода используется функция Blockly.Generator.workspaceToCode. генерировать код из блоков. Как только все блоки обработаны, он вызывает функцию генератора finish для добавления объявлений переменных.

Вы можете сами увидеть finish в python.js. :

/**
 * Prepend the generated code with the variable definitions.
 * @param {string} code Generated code.
 * @return {string} Completed code.
 */
Blockly.Python.finish = function(code) { 
...

Вам нужно будет свернуть свой собственный код генератора, если вы не можете использовать встроенные конструкции из Blockly. Вы можете использовать этот код из Blockly в качестве отправной точки, хотя это будет сложно, потому что вам нужно будет поддерживать свой собственный список объявлений переменных.

person Justin Ethier    schedule 10.09.2013
comment
Вы имеете в виду, что я должен сгенерировать код в конце? хорошо, я попробую это. Но если вы попробуете эту демонстрацию blockly-demo.appspot.com/static/ apps/code/index.html переменная init генерируется на лету (они используют объекты var, которые я не использую) - person user2196728; 10.09.2013
comment
@ user2196728 - Вы можете сгенерировать код, когда захотите, я просто хочу сказать, что когда вы это делаете, вам нужно использовать алгоритм, подобный тому, который использует Blockly, и следовать за ним завершающим проходом, который добавляет ваши объявления переменных. - person Justin Ethier; 11.09.2013