Files
mixly3/boards/default_src/python/generators/control.js
2024-09-21 22:29:48 +08:00

281 lines
11 KiB
JavaScript

import * as Blockly from 'blockly/core';
export const controls_main = function (a, generator) {
var d = generator.statementToCode(a, "DO"),
d = generator.addLoopTrap(d, a.id) || generator.PASS;
return "if __name__ == '__main__':\n" + d;
}
export const base_setup = function (_, generator) {
var branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "").replace(/\n {4}/g, '\n');//去除两端空格
if (branch.endsWith('\n')) {
generator.setups_['setup_setup'] = branch;
}
else {
generator.setups_['setup_setup'] = branch + '\n';
}
return '';
}
// ok
export const controls_if = function (a, generator) {
var b = 0,
c = "",
d,
e;
do
e = generator.valueToCode(a, "IF" + b, generator.ORDER_NONE) || "False", d = generator.statementToCode(a, "DO" + b) || generator.PASS, c += (0 == b ? "if " : "elif ") + e + ":\n" + d, ++b;
while (a.getInput("IF" + b));
a.getInput("ELSE") && (d = generator.statementToCode(a, "ELSE") || generator.PASS, c += "else:\n" + d);
return c
}
export const controls_try_finally = function (_, generator) {
var n = 0;
var argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || 'null';
var branch = '';
var t = generator.statementToCode(this, 'try') || ' pass\n';
var code = 'try:\n' + t;
for (n = 1; n <= this.elseifCount_; n++) {
argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || '';
if (argument !== '')
argument = ' ' + argument
branch = generator.statementToCode(this, 'DO' + n) || ' pass\n';
code += 'except' + argument + ': \n' + branch;
}
if (this.elseCount_) {
branch = generator.statementToCode(this, 'ELSE') || ' pass\n';
code += 'finally:\n' + branch;
}
// code += '}';
return code;
}
// ok
export const controls_for = function (a, generator) {
var b = generator.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE),
//var b = generator.valueToCode(a, "VAR", generator.ORDER_MEMBER) || "''",
c = generator.valueToCode(a, "FROM", generator.ORDER_NONE) || "0",
d = generator.valueToCode(a, "TO", generator.ORDER_NONE) || "0",
e = generator.valueToCode(a, "STEP", generator.ORDER_NONE) || "1",
f = generator.statementToCode(a, "DO"),
f = generator.addLoopTrap(f, a.id) || generator.PASS,
g = "",
h = function (_, generator) {
return generator.provideFunction_("upRange",
["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start <= stop:", " yield start", " start += abs(step)"])
},
k = function (_, generator) {
return generator.provideFunction_("downRange", ["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start >= stop:", " yield start", " start -= abs(step)"])
}
a = function (a, b, c) {
return "(" + a + " <= " + b + ") and " + h() + "(" + a + ", " + b + ", " + c + ") or " + k() + "(" + a + ", " + b + ", " + c + ")"
}
if (Blockly.isNumber(c) && Blockly.isNumber(d) &&
Blockly.isNumber(e))
c = parseFloat(c), d = parseFloat(d), e = Math.abs(parseFloat(e)), 0 === c % 1 && 0 === d % 1 && 0 === e % 1 ? (c <= d ? (d++, a = 0 == c && 1 == e ? d : c + ", " + d, 1 != e && (a += ", " + e)) : (d--, a = c + ", " + d + ", -" + e), a = "range(" + a + ")") : (a = c < d ? h() : k(), a += "(" + c + ", " + d + ", " + e + ")");
else {
var l = function (a, c) {
if (Blockly.isNumber(a))
a = parseFloat(a);
else {
var d = generator.variableDB_.getDistinctName(b + c, Blockly.Variables.NAME_TYPE);
g += d + " = " + a + "\n";
a = d
}
return a
},
c = l(c, "_start"),
d = l(d, "_end");
l(e, "_inc");
a = "number" == typeof c && "number" == typeof d ? c < d ? h(c, d, e) : k(c, d, e) : a(c, d, e)
}
return g += "for " + b + " in " + a + ":\n" + f
}
export const controls_for_range = function (block, generator) {
var iter = generator.variableDB_.getName(block.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE),
from = generator.valueToCode(block, "FROM", generator.ORDER_NONE) || "0",
end = generator.valueToCode(block, "TO", generator.ORDER_NONE) || "0",
step = generator.valueToCode(block, "STEP", generator.ORDER_NONE) || "1",
dostatement = generator.statementToCode(block, "DO"),
pass = generator.addLoopTrap(dostatement, block.id) || generator.PASS;
generator.setups_["mixly_range"] = "def mixly_range(start, stop, step):\n" +
" for i in range(start, stop + 1, step):\n" +
" yield i\n\n";
return "for " + iter + " in mixly_range(" + from + ", " + end + ", " + step + "):\n" + pass;
}
export const controls_whileUntil = function (a, generator) {
var b = "UNTIL" == a.getFieldValue("MODE"),
c = generator.valueToCode(a, "BOOL", generator.ORDER_NONE) || "False",
d = generator.statementToCode(a, "DO"),
d = generator.addLoopTrap(d, a.id) || generator.PASS;
b && (c = "not " + c);
return "while " + c + ":\n" + d
}
// export const controls_flow_statements = function (_, generator) {
// // Flow statements: continue, break.
// switch (this.getFieldValue('FLOW')) {
// case 'BREAK':
// return 'break;\n';
// case 'CONTINUE':
// return 'continue;\n';
// }
// throw 'Unknown flow statement.';
// }
//ok
export const controls_flow_statements = function (a) {
switch (a.getFieldValue("FLOW")) {
case "BREAK":
return "break\n";
case "CONTINUE":
return "continue\n"
}
throw "Unknown flow statement.";
}
// ok
export const controls_delay = function (_, generator) {
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var code = 'sleep(' + delay_time + ')\n';
return code;
}
// ok
export const Panic_with_status_code = function (_, generator) {
var status_code = generator.valueToCode(this, 'STATUS_CODE', generator.ORDER_ATOMIC) || '1000'
var code = 'panic(' + status_code + ')\n';
return code;
}
// ok
export const controls_millis = function (_, generator) {
generator.definitions_.import_time = "import time";
var code = 'time.time()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const reset = function (_, generator) {
generator.definitions_['import_microbit'] = 'from microbit import *'
return 'reset()\n';
}
export const controls_interrupts = function () {
return 'interrupts();\n';
}
export const controls_nointerrupts = function () {
return 'noInterrupts();\n';
}
export const controls_forEach = function (block, generator) {
// For each loop.
var variable0 = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\'\'';
var argument0 = generator.valueToCode(block, 'LIST',
generator.ORDER_RELATIONAL) || '[]';
var branch = generator.statementToCode(block, 'DO');
branch = generator.addLoopTrap(branch, block.id) ||
generator.PASS;
var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch;
return code;
}
export const controls_range = function (_, generator) {
var from = generator.valueToCode(this, "FROM", generator.ORDER_NONE) || "0";
var end = generator.valueToCode(this, "TO", generator.ORDER_NONE) || "0";
var step = generator.valueToCode(this, "STEP", generator.ORDER_NONE) || "1";
var code = "range(" + from + ", " + end + ", " + step + ")";
return [code, generator.ORDER_ATOMIC];
}
export const controls_lambda = function (a, generator) {
var c = generator.valueToCode(a, "BOOL", generator.ORDER_NONE) || "None",
d = generator.statementToCode(a, "DO") || "pass";
var code = "lambda " + c + ": " + d;
code = code.replace('\n', '').replace(' ', '')
return [code, generator.ORDER_ATOMIC];
}
export const time_sleep = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var code = 'time.sleep(' + delay_time + ')\n';
return code;
}
export const controls_pass = function () {
return 'pass\n';
}
export const controls_thread = function (_, generator) {
generator.definitions_['import__thread'] = 'import _thread';
var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None";
var callback = generator.variableDB_.getName(
generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None",
Blockly.Procedures.NAME_TYPE
);
var code = "_thread.start_new_thread(" + callback + ", " + v + ")\n";
return code;
}
// do-while循环
export const do_while = function (_, generator) {
var value_select_data = generator.valueToCode(this, 'select_data', generator.ORDER_NONE) || "False";
var statements_input_data = generator.statementToCode(this, 'input_data')
var dropdown_type = this.getFieldValue('type');
if (dropdown_type == 'true') {
statements_input_data = statements_input_data + ' if (' + value_select_data + '):\n' + ' break\n';
}
else {
statements_input_data = statements_input_data + ' if not (' + value_select_data + '):\n' + ' break\n';
}
statements_input_data = generator.addLoopTrap(statements_input_data, this.id) || generator.PASS;
//var dropdown_type = this.getFieldValue('type');
var code = 'while True:\n' + statements_input_data;
return code;
}
// export const base_type = controls_type;
// export const controls_TypeLists = controls_typeLists;
export const controls_repeat_ext = function (a, generator) {
var times = generator.valueToCode(this, 'TIMES', generator.ORDER_ATOMIC);
var d = generator.statementToCode(a, "DO"),
d = generator.addLoopTrap(d, a.id) || generator.PASS;
return 'for _my_variable in range(' + times + '):\n' + d;
}
export const garbage_collection = function (_, generator) {
generator.definitions_['import_gc'] = 'import gc';
var code = 'gc.collect()\n'
return code;
}
export const get_mem_alloc = function (_, generator) {
generator.definitions_['import_gc'] = 'import gc';
var code = 'gc.mem_alloc()\n';
return [code, generator.ORDER_ATOMIC];
}
export const get_mem_free = function (_, generator) {
generator.definitions_['import_gc'] = 'import gc';
var code = 'gc.mem_free()\n';
return [code, generator.ORDER_ATOMIC]
}
export const get_unique_identifier = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var code = 'machine.unique_id()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const controls_repeat = controls_repeat_ext;