如上
作者 @淘汰郎 https://www.bandbbs.cn/threads/9536/
•index.bin 大小縮小>90% (77 kb -> 7 kb)
•大幅減少APP對手環RAM的使用量
•使用更快更流暢
•UI優化
源代碼 (僅作部份開源,有興趣可以自己去原帖買,只需2023 coins 哦 🙂 ):
作者 @淘汰郎 https://www.bandbbs.cn/threads/9536/
•index.bin 大小縮小>90% (77 kb -> 7 kb)
•大幅減少APP對手環RAM的使用量
•使用更快更流暢
•UI優化
源代碼 (僅作部份開源,有興趣可以自己去原帖買,只需2023 coins 哦 🙂 ):
JavaScript:
/**
* Build with ZMake tool
*/
// Build at 2022-08-08 16:53:06.368238
(() => {
// source: /home/melianmiko/Projects/mb7_apps/calculator/src/Calculator.js
class Calculator {
buttons = [];
screen = null;
screenData = "";
currentSet = [];
currentSetId = -1;
buttonSets = [
["7", "8", "9", "4", "5", "6", "1", "2", "3", "0", "."],
["+", "-", "×", "÷", "^", "√", "|", "=", "π", "(", ")"],
["x", "y", "z", "分數", "又", "分之", "", "", "", "", ""],];
operations = {
"+": "+",
"-": "-",
"×": "×",
"÷": "÷",
"^": "^",
"√": "√(",
"∛": "∛(",
"π": "π",
"分數": "分數(",
};
start() {
// Init screen
hmUI.createWidget(5, {
x: 5,
y: 80,
w: 183,
h: 76,
radius: 8,
line_width: 2,
color: 0x222222
});
this.screen = hmUI.createWidget(2, {
x: 11,
y: 80,
w: 172,
h: 80,
color: 0xc5c5c5,
text_size: 24,
text_style: 1,
align_v: 16,
});
this.screen.addEventListener(3, () => {
this.backspace();
});
// Init buttons
for (let i = 0; i < 12; i++) {
this.buttons[i] = hmUI.createWidget(23, {
x: (i % 3) * 64 + 2,
y: Math.floor(i / 3) * 64 + 168,
w: 60,
h: 60,
radius: 8,
text_size: 28,
normal_color: 0x222222,
press_color: 0x333333,
click_func: this.initButtonEvents(i),
});
}
this.buttons[11].setProperty(0, {
x: 130,
y: 360,
w: 60,
h: 60,
text: "...",
normal_color: 0x444444,
press_color: 0x666666,
});
this.switchSet();
hmUI.createWidget(5, {
x: 5,
y: 80,
w: 183,
h: 76,
radius: 8,
line_width: 2,
color: 0x222222
});
this.screen = hmUI.createWidget(2, {
x: 11,
y: 80,
w: 172,
h: 80,
color: 0xc5c5c5,
text_size: 24,
text_style: 1,
align_v: 16,
});
this.screen.addEventListener(3, () => {
this.backspace();
});
// Init buttons
for (let i = 0; i < 12; i++) {
this.buttons[i] = hmUI.createWidget(23, {
x: (i % 3) * 64 + 2,
y: Math.floor(i / 3) * 64 + 168,
w: 60,
h: 60,
radius: 8,
text_size: 28,
normal_color: 0x222222,
press_color: 0x333333,
click_func: this.initButtonEvents(i),
});
}
this.buttons[11].setProperty(0, {
x: 130,
y: 360,
w: 60,
h: 60,
text: "...",
normal_color: 0x444444,
press_color: 0x666666,
});
this.switchSet();
// Init remove and process buttons
hmUI.createWidget(23, {
x: 0,
y: 426,
w: 192,
h: 65,
text: "解方程式",
normal_color: 0x222222,
press_color: 0x444444,
text_size: 28,
click_func: () => {
this.process();
}
});
hmUI.createWidget(23, {
x: 0,
y: 0,
w: 192,
h: 70,
text: "拉進垃圾車",
text_size: 20,
color: 0x999999,
click_func: () => {
this.clear();
}
});
}
calcFactorial(num) {
if (num % 1 != 0 || num < 0) {
num++;
return Math.sqrt(2 * Math.PI / num) * Math.pow((1 / Math.E) * (num + 1 / (12 * num - 1 / (10 * num))), num);
} else {
return (num == 0) ? 1 : num * this.calcFactorial(num - 1);
}
}
process() {
let Error = false;
const brDiff = this._countIncl(this.screenData, "(") - this._countIncl(this.screenData, ")");
if (brDiff === 0) {
try {
function solveEquation(equationString) {
/* function not open source
bytecode:
/sdcard/index.js:181: function: solveEquation
mode: strict
args: equationString
locals:
0: var Fraction
1: var parseNumber
2: var arr
3: catch error [level:3 next:4]
4: let unknownVariable [level:1 next:-1]
5: let tolerance [level:6 next:4]
6: let maxIterations [level:6 next:5]
7: let replacedEquationString [level:6 next:6]
8: let equation [level:6 next:7]
9: let leftHandSide [level:6 next:8]
10: let rightHandSide [level:6 next:9]
11: let equationFunction [level:6 next:10]
12: let ans [level:6 next:11]
13: let text [level:6 next:12]
14: let guess [level:6 next:13]
15: let i [level:7 next:14]
16: let f [level:8 next:15]
17: const parsedNumber [level:10 next:18]
18: let df [level:8 next:16]
19: var this
20: var new.target
21: var arguments
closure vars:
0: solveEquation local:loc2 let
1: brDiff local:loc1 const
2: Error local:loc0 let
3: <class_fields_init> parent:loc0 const
4: Calculator parent:loc1 const
5: __$$module$$__ parent:loc2 let
6: __$$app$$__ parent:loc3 let
7: Calculator parent:loc4 let
stack_size: 9
opcodes:
0 0C 03 special_object 3
2 C2 14 put_loc8 20: "new.target"
4 08 push_this
5 C2 13 put_loc8 19: this
7 0C 00 special_object 0
9 C2 15 put_loc8 21: arguments
11 BF 00 fclosure8 0: [bytecode Fraction]
13 C8 put_loc0 0: Fraction
[definition of function Fraction(str)]
*/
function Fraction(str) {
/*
function not open source
bytecode:
/sdcard/index.js:182: function: Fraction
mode: strict
args: str
locals:
0: let arr [level:7 next:-1]
1: let arr [level:11 next:-1]
stack_size: 5
opcodes:
0 D0 get_arg0 0: str
1 98 typeof
2 04 48 00 00 00 push_atom_value string
7 AD strict_neq
8 E9 0B if_false8 20
10 D0 get_arg0 0: str
11 42 37 00 00 00 get_field2 toString
16 24 00 00 call_method 0
19 D4 put_arg0 0: str
20 BE 00 20: push_const8 0: 1"\u5206\u6570\\([^)]+\\)"
22 BE 01 push_const8 1: 1"\u0000\u0001\u00009\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u0006R\u0001pe\u0001(\u0000\u001c\u000c\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0002\u0000\u0000\u0000(\u0000*\u0000\u00ff\u00ff\n\u0001)\u0000\u000c\u0000\n"
24 33 regexp
25 42 82 01 00 00 get_field2 test
30 D0 get_arg0 0: str
31 24 01 00 call_method 1
34 E9 1C if_false8 63
36 38 BC 01 00 00 get_var hmUI
41 42 08 02 00 00 get_field2 showToast
46 0B object
47 04 09 02 00 00 push_atom_value "\u00e6\u00a0\u00bc\u00e5\u00bc\u008f\u00e4\u00b8\u008d\u00e7\u00ac\u00a6\u00e5\u0090\u0088\n\u00e5\u00b7\u00b2\u00e6\u0094\u00b9\u00e6\u0088\u00900"
52 4C D1 01 00 00 define_field text
57 24 01 00 call_method 1
60 0E drop
61 B4 push_0 0
62 28 return
63 BE 02 63: push_const8 2: 1"(^[\\s\\S]*)\u53c8([\\s\\S]*)\u5206\u4e4b([\\s\\S]*)"
65 BE 03 push_const8 3: 1"\u0000\u0004\u0000q\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u000b\u0001\u0005\u001c\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u00ff\u00ff\n\u000c\u0001\u0001\u00c8S\u000b\u0002\u001c\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u00ff\u00ff\n\u000c\u0002\u0001\u0006R\u0001KN\u000b\u0003\u001c\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u00ff\u00ff\n\u000c\u0003\u000c\u0000\n"
67 33 regexp
68 42 82 01 00 00 get_field2 test
73 D0 get_arg0 0: str
74 24 01 00 call_method 1
77 69 C2 00 00 00 if_false 272
82 61 00 00 set_loc_uninitialized 0: arr
85 D0 get_arg0 0: str
86 42 5C 00 00 00 get_field2 split
91 BE 04 push_const8 4: 1"\u53c8|\u5206\u4e4b"
93 BE 05 push_const8 5: 1"\u0000\u0001\u0000#\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0009\u0008\u0000\u0000\u0000\u0001\u00c8S\u0007\u0006\u0000\u0000\u0000\u0001\u0006R\u0001KN\u000c\u0000\n"
95 33 regexp
96 24 01 00 call_method 1
99 C8 put_loc0 0: arr
100 62 00 00 get_loc_check 0: arr
103 E8 get_length
104 B7 push_3 3
105 AD strict_neq
106 11 dup
107 EA 26 if_true8 146
109 0E drop
110 BE 06 push_const8 6: 1"\u53c8"
112 BE 07 push_const8 7: 1"\u0000\u0001\u0000\u0013\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u00c8S\u000c\u0000\n"
114 33 regexp
115 42 82 01 00 00 get_field2 test
120 D0 get_arg0 0: str
121 24 01 00 call_method 1
124 0A push_true
125 AD strict_neq
126 11 dup
127 EA 12 if_true8 146
129 0E drop
130 BE 08 push_const8 8: 1"\u5206\u4e4b"
132 BE 09 push_const8 9: 1"\u0000\u0001\u0000\u0016\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u0006R\u0001KN\u000c\u0000\n"
134 33 regexp
135 42 82 01 00 00 get_field2 test
140 D0 get_arg0 0: str
141 24 01 00 call_method 1
144 0A push_true
145 AD strict_neq
146 E9 1C 146: if_false8 175
148 38 BC 01 00 00 get_var hmUI
153 42 08 02 00 00 get_field2 showToast
158 0B object
159 04 09 02 00 00 push_atom_value "\u00e6\u00a0\u00bc\u00e5\u00bc\u008f\u00e4\u00b8\u008d\u00e7\u00ac\u00a6\u00e5\u0090\u0088\n\u00e5\u00b7\u00b2\u00e6\u0094\u00b9\u00e6\u0088\u00900"
164 4C D1 01 00 00 define_field text
169 24 01 00 call_method 1
172 0E drop
173 B4 push_0 0
174 28 return
175 38 A3 01 00 00 175: get_var console
180 42 A2 01 00 00 get_field2 log
185 04 DD 01 00 00 push_atom_value "("
190 62 00 00 get_loc_check 0: arr
193 B4 push_0 0
194 47 get_array_el
195 9E add
196 04 0A 02 00 00 push_atom_value " + "
201 9E add
202 62 00 00 get_loc_check 0: arr
205 B6 push_2 2
206 47 get_array_el
207 9E add
208 04 0B 02 00 00 push_atom_value " / "
213 9E add
214 62 00 00 get_loc_check 0: arr
217 B5 push_1 1
218 47 get_array_el
219 9E add
220 04 DE 01 00 00 push_atom_value ")"
225 9E add
226 24 01 00 call_method 1
229 0E drop
230 04 DD 01 00 00 push_atom_value "("
235 62 00 00 get_loc_check 0: arr
238 B4 push_0 0
239 47 get_array_el
240 9E add
241 04 0A 02 00 00 push_atom_value " + "
246 9E add
247 62 00 00 get_loc_check 0: arr
250 B6 push_2 2
251 47 get_array_el
252 04 0B 02 00 00 push_atom_value " / "
257 9E add
258 62 00 00 get_loc_check 0: arr
261 B5 push_1 1
262 47 get_array_el
263 9E add
264 9E add
265 04 DE 01 00 00 push_atom_value ")"
270 9E add
271 28 return
272 BE 0A 272: push_const8 10: 1"(^[\\s\\S]*)\u5206\u4e4b([\\s\\S]*)"
274 BE 0B push_const8 11: 1"\u0000\u0003\u0000Q\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u000b\u0001\u0005\u001c\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u00ff\u00ff\n\u000c\u0001\u0001\u0006R\u0001KN\u000b\u0002\u001c\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u00ff\u00ff\n\u000c\u0002\u000c\u0000\n"
276 33 regexp
277 42 82 01 00 00 get_field2 test
282 D0 get_arg0 0: str
283 24 01 00 call_method 1
286 69 96 00 00 00 if_false 437
291 61 01 00 set_loc_uninitialized 1: arr
294 D0 get_arg0 0: str
295 42 5C 00 00 00 get_field2 split
300 BE 0C push_const8 12: 1"\u5206\u4e4b"
302 BE 0D push_const8 13: 1"\u0000\u0001\u0000\u0016\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u0006R\u0001KN\u000c\u0000\n"
304 33 regexp
305 24 01 00 call_method 1
308 C9 put_loc1 1: arr
309 62 01 00 get_loc_check 1: arr
312 E8 get_length
313 B6 push_2 2
314 AD strict_neq
315 11 dup
316 EA 12 if_true8 335
318 0E drop
319 BE 0E push_const8 14: 1"\u5206\u4e4b"
321 BE 0F push_const8 15: 1"\u0000\u0001\u0000\u0016\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u0006R\u0001KN\u000c\u0000\n"
323 33 regexp
324 42 82 01 00 00 get_field2 test
329 D0 get_arg0 0: str
330 24 01 00 call_method 1
333 0A push_true
334 AD strict_neq
335 E9 1C 335: if_false8 364
337 38 BC 01 00 00 get_var hmUI
342 42 08 02 00 00 get_field2 showToast
347 0B object
348 04 09 02 00 00 push_atom_value "\u00e6\u00a0\u00bc\u00e5\u00bc\u008f\u00e4\u00b8\u008d\u00e7\u00ac\u00a6\u00e5\u0090\u0088\n\u00e5\u00b7\u00b2\u00e6\u0094\u00b9\u00e6\u0088\u00900"
353 4C D1 01 00 00 define_field text
358 24 01 00 call_method 1
361 0E drop
362 B4 push_0 0
363 28 return
364 38 A3 01 00 00 364: get_var console
369 42 A2 01 00 00 get_field2 log
374 04 DD 01 00 00 push_atom_value "("
379 62 01 00 get_loc_check 1: arr
382 B5 push_1 1
383 47 get_array_el
384 9E add
385 04 0B 02 00 00 push_atom_value " / "
390 9E add
391 62 01 00 get_loc_check 1: arr
394 B4 push_0 0
395 47 get_array_el
396 9E add
397 04 DE 01 00 00 push_atom_value ")"
402 9E add
403 24 01 00 call_method 1
406 0E drop
407 04 DD 01 00 00 push_atom_value "("
412 62 01 00 get_loc_check 1: arr
415 B5 push_1 1
416 47 get_array_el
417 9E add
418 04 0B 02 00 00 push_atom_value " / "
423 9E add
424 62 01 00 get_loc_check 1: arr
427 B4 push_0 0
428 47 get_array_el
429 9E add
430 04 DE 01 00 00 push_atom_value ")"
435 9E add
436 28 return
437 38 BC 01 00 00 437: get_var hmUI
442 42 08 02 00 00 get_field2 showToast
447 0B object
448 04 09 02 00 00 push_atom_value "\u00e6\u00a0\u00bc\u00e5\u00bc\u008f\u00e4\u00b8\u008d\u00e7\u00ac\u00a6\u00e5\u0090\u0088\n\u00e5\u00b7\u00b2\u00e6\u0094\u00b9\u00e6\u0088\u00900"
453 4C D1 01 00 00 define_field text
458 24 01 00 call_method 1
461 0E drop
462 B4 push_0 0
463 28 return
*/
}
/*
bytecode:
14 BF 01 fclosure8 1: [bytecode parseNumber]
16 C9 put_loc1 1: parseNumber
[definition of function parseNumber(str)]
*/
function parseNumber(str) {
/*
function not open source
bytecode:
/sdcard/index.js:211: function: parseNumber
mode: strict
args: str
locals:
0: const regex [level:1 next:-1]
1: const matches [level:1 next:0]
2: let integerPart [level:5 next:1]
3: let decimalPart [level:5 next:2]
stack_size: 4
opcodes:
0 61 01 00 set_loc_uninitialized 1: matches
3 61 00 00 set_loc_uninitialized 0: regex
6 D0 get_arg0 0: str
7 98 typeof
8 04 46 00 00 00 push_atom_value number
13 AC strict_eq
14 E9 0B if_false8 26
16 D0 get_arg0 0: str
17 42 37 00 00 00 get_field2 toString
22 24 00 00 call_method 0
25 D4 put_arg0 0: str
26 BE 00 26: push_const8 0: 1"^(-?\\d+)(\\.\\d+)?$"
28 BE 01 push_const8 1: 1"\u0000\u0003\u0000l\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0005\u000b\u0001\u001c\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001-\u0000\n\u001c\u0008\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u00000\u00009\u0000\n\u000c\u0001\u000d\u0002\u0002\u0009 \u0000\u0000\u0000\u000b\u0002\u0001.\u0000\u001c\u0008\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0001\u00000\u00009\u0000\n\u000c\u0002\u0006\u000c\u0000\n"
30 33 regexp
31 C8 put_loc0 0: regex
32 D0 get_arg0 0: str
33 42 22 01 00 00 get_field2 match
38 62 00 00 get_loc_check 0: regex
41 24 01 00 call_method 1
44 C9 put_loc1 1: matches
45 62 01 00 get_loc_check 1: matches
48 E9 60 if_false8 145
50 61 03 00 set_loc_uninitialized 3: decimalPart
53 61 02 00 set_loc_uninitialized 2: integerPart
56 62 01 00 get_loc_check 1: matches
59 B5 push_1 1
60 47 get_array_el
61 CA put_loc2 2: integerPart
62 62 01 00 get_loc_check 1: matches
65 B6 push_2 2
66 47 get_array_el
67 CB put_loc3 3: decimalPart
68 62 03 00 get_loc_check 3: decimalPart
71 E9 1D if_false8 101
73 62 03 00 get_loc_check 3: decimalPart
76 42 28 01 00 00 get_field2 replace
81 BE 02 push_const8 2: 1"^\\."
83 BE 03 push_const8 3: 1"\u0000\u0001\u0000\u0014\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0005\u0001.\u0000\u000c\u0000\n"
85 33 regexp
86 04 0E 02 00 00 push_atom_value "0."
91 24 02 00 call_method 2
94 11 dup
95 63 03 00 put_loc_check 3: decimalPart
98 0E drop
99 EB 0B goto8 111
101 04 0F 02 00 00 101: push_atom_value "0.0"
106 11 dup
107 63 03 00 put_loc_check 3: decimalPart
110 0E drop
111 0B 111: object
112 62 02 00 get_loc_check 2: integerPart
115 42 37 00 00 00 get_field2 toString
120 24 00 00 call_method 0
123 4C FE 01 00 00 define_field integerPart
128 62 03 00 get_loc_check 3: decimalPart
131 42 37 00 00 00 get_field2 toString
136 24 00 00 call_method 0
139 4C 00 02 00 00 define_field decimalPart
144 28 return
145 D0 145: get_arg0 0: str
146 28 return
*/
}
/*
17 61 04 00 set_loc_uninitialized 4: unknownVariable
20 6C 23 00 00 00 catch 56
25 D0 get_arg0 0: equationString
26 42 22 01 00 00 get_field2 match
31 BE 02 push_const8 2: 1"[a-zA-Z]+"
33 BE 03 push_const8 3: 1"\u0001\u0001\u0000-\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u001c\u000c\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0002\u0000A\u0000Z\u0000a\u0000z\u0000\n\u000c\u0000\n"
35 33 regexp
36 24 01 00 call_method 1
39 42 EE 00 00 00 get_field2 reduce
44 BF 04 fclosure8 4: [bytecode <null>]
46 26 00 00 array_from 0
49 24 02 00 call_method 2
52 CA put_loc2 2: arr
53 0E drop
54 EB 0B goto8 66
56 CB 56: put_loc3 3: error
57 6C 07 00 00 00 catch 65
62 0E drop
63 EB 02 goto8 66
65 2F 65: throw
66 C6 66: get_loc2 2: arr
67 B4 push_0 0
68 47 get_array_el
69 C2 04 put_loc8 4: unknownVariable
71 C6 get_loc2 2: arr
72 E8 get_length
73 B5 push_1 1
74 AC strict_eq
75 69 67 02 00 00 if_false 691
80 61 0E 00 set_loc_uninitialized 14: guess
83 61 0D 00 set_loc_uninitialized 13: text
86 61 0C 00 set_loc_uninitialized 12: ans
89 61 0B 00 set_loc_uninitialized 11: equationFunction
92 61 0A 00 set_loc_uninitialized 10: rightHandSide
95 61 09 00 set_loc_uninitialized 9: leftHandSide
98 61 08 00 set_loc_uninitialized 8: equation
101 61 07 00 set_loc_uninitialized 7: replacedEquationString
104 61 06 00 set_loc_uninitialized 6: maxIterations
107 61 05 00 set_loc_uninitialized 5: tolerance
110 BE 05 push_const8 5: 1e-08
112 C2 05 put_loc8 5: tolerance
114 BD 10 27 push_i16 10000
117 C2 06 put_loc8 6: maxIterations
119 D0 get_arg0 0: equationString
120 42 28 01 00 00 get_field2 replace
125 BE 06 push_const8 6: 1"(\\d|\\))(\\(|[a-z]|\u03c0|\u5206\u6578)"
127 BE 07 push_const8 7: 1"\u0001\u0003\u0000]\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u000b\u0001\u0009\u000c\u0000\u0000\u0000\u0015\u0001\u00000\u00009\u0000\u0007\u0003\u0000\u0000\u0000\u0001)\u0000\u000c\u0001\u000b\u0002\u0009&\u0000\u0000\u0000\u0009\u0019\u0000\u0000\u0000\u0009\u0008\u0000\u0000\u0000\u0001(\u0000\u0007\u0007\u0000\u0000\u0000\u0015\u0001\u0000a\u0000z\u0000\u0007\u0003\u0000\u0000\u0000\u0001\u00c0\u0003\u0007\u0006\u0000\u0000\u0000\u0001\u0006R\u0001xe\u000c\u0002\u000c\u0000\n"
129 33 regexp
130 04 F3 01 00 00 push_atom_value "$1*$2"
135 24 02 00 call_method 2
138 42 28 01 00 00 get_field2 replace
143 BE 08 push_const8 8: 1"\\^"
145 BE 09 push_const8 9: 1"\u0001\u0001\u0000\u0013\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001^\u0000\u000c\u0000\n"
147 33 regexp
148 04 F4 01 00 00 push_atom_value "**"
153 24 02 00 call_method 2
156 42 28 01 00 00 get_field2 replace
161 BE 0A push_const8 10: 1"\u00d7"
163 BE 0B push_const8 11: 1"\u0001\u0001\u0000\u0013\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u00d7\u0000\u000c\u0000\n"
165 33 regexp
166 04 7C 00 00 00 push_atom_value "*"
171 24 02 00 call_method 2
174 42 28 01 00 00 get_field2 replace
179 BE 0C push_const8 12: 1"\u00f7"
181 BE 0D push_const8 13: 1"\u0001\u0001\u0000\u0013\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u00f7\u0000\u000c\u0000\n"
183 33 regexp
184 04 F5 01 00 00 push_atom_value "/"
189 24 02 00 call_method 2
192 42 28 01 00 00 get_field2 replace
197 BE 0E push_const8 14: 1"\u03c0"
199 BE 0F push_const8 15: 1"\u0001\u0001\u0000\u0013\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u00c0\u0003\u000c\u0000\n"
201 33 regexp
202 04 F6 01 00 00 push_atom_value "3.14"
207 24 02 00 call_method 2
210 42 28 01 00 00 get_field2 replace
215 BE 10 push_const8 16: 1"\\|([^|]+)\\|"
217 BE 11 push_const8 17: 1"\u0001\u0002\u00007\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001|\u0000\u000b\u0001\u001c\u000c\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0002\u0000\u0000\u0000{\u0000}\u0000\u00ff\u00ff\n\u000c\u0001\u0001|\u0000\u000c\u0000\n"
219 33 regexp
220 04 F7 01 00 00 push_atom_value "(Math.abs($1))"
225 24 02 00 call_method 2
228 42 28 01 00 00 get_field2 replace
233 BE 12 push_const8 18: 1"\u221a\\(([^)]+)\\)"
235 BE 13 push_const8 19: 1"\u0001\u0002\u0000:\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u001a\"\u0001(\u0000\u000b\u0001\u001c\u000c\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0002\u0000\u0000\u0000(\u0000*\u0000\u00ff\u00ff\n\u000c\u0001\u0001)\u0000\u000c\u0000\n"
237 33 regexp
238 04 F8 01 00 00 push_atom_value "(Math.sqrt($1))"
243 24 02 00 call_method 2
246 42 28 01 00 00 get_field2 replace
251 BE 14 push_const8 20: 1"\u5206\u6578\\(([^)]+)\\)"
253 BE 15 push_const8 21: 1"\u0001\u0002\u0000=\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0001\u0006R\u0001xe\u0001(\u0000\u000b\u0001\u001c\u000c\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u00ff\u00ff\u00ff\u007f\u0001\u0000\u0000\u0000\u0015\u0002\u0000\u0000\u0000(\u0000*\u0000\u00ff\u00ff\n\u000c\u0001\u0001)\u0000\u000c\u0000\n"
255 33 regexp
256 BF 16 fclosure8 22: [bytecode <null>]
258 24 02 00 call_method 2
261 C2 07 put_loc8 7: replacedEquationString
263 38 A3 01 00 00 get_var console
268 42 A2 01 00 00 get_field2 log
273 62 07 00 get_loc_check 7: replacedEquationString
276 24 01 00 call_method 1
279 0E drop
280 62 07 00 get_loc_check 7: replacedEquationString
283 42 28 01 00 00 get_field2 replace
288 BE 17 push_const8 23: 1"\\s"
290 BE 18 push_const8 24: 1"\u0001\u0001\u0000;\u0000\u0000\u0000\u0008\u0006\u0000\u0000\u0000\u0004\u0007\u00f5\u00ff\u00ff\u00ff\u000b\u0000\u0015\n\u0000\u0009\u0000\u000d\u0000 \u0000 \u0000\u00a0\u0000\u00a0\u0000\u0080\u0016\u0080\u0016\u0000 \n ( ) / / _ _ \u00000\u00000\u00ff\u00fe\u00ff\u00fe\u000c\u0000\n"
292 33 regexp
293 C0 push_empty_string
294 24 02 00 call_method 2
297 C2 08 put_loc8 8: equation
299 62 08 00 get_loc_check 8: equation
302 42 5C 00 00 00 get_field2 split
307 04 F9 01 00 00 push_atom_value "="
312 24 01 00 call_method 1
315 B4 push_0 0
316 47 get_array_el
317 C2 09 put_loc8 9: leftHandSide
319 62 08 00 get_loc_check 8: equation
322 42 5C 00 00 00 get_field2 split
327 04 F9 01 00 00 push_atom_value "="
332 24 01 00 call_method 1
335 B5 push_1 1
336 47 get_array_el
337 C2 0A put_loc8 10: rightHandSide
339 38 3A 00 00 00 get_var eval
344 04 DD 01 00 00 push_atom_value "("
349 42 5B 00 00 00 get_field2 concat
354 62 04 00 get_loc_check 4: unknownVariable
357 04 FA 01 00 00 push_atom_value ") => "
362 62 09 00 get_loc_check 9: leftHandSide
365 04 FB 01 00 00 push_atom_value " - ("
370 62 0A 00 get_loc_check 10: rightHandSide
373 04 DE 01 00 00 push_atom_value ")"
378 24 06 00 call_method 6
381 31 01 00 0F 00 eval 1,15
386 C2 0B put_loc8 11: equationFunction
388 C0 push_empty_string
389 C2 0C put_loc8 12: ans
391 06 undefined
392 C2 0D put_loc8 13: text
394 B5 push_1 1
395 C2 0E put_loc8 14: guess
397 61 0F 00 set_loc_uninitialized 15: i
400 B4 push_0 0
401 C2 0F put_loc8 15: i
403 62 0F 00 403: get_loc_check 15: i
406 62 06 00 get_loc_check 6: maxIterations
409 A4 lt
410 69 F8 00 00 00 if_false 659
415 61 12 00 set_loc_uninitialized 18: df
418 61 10 00 set_loc_uninitialized 16: f
421 62 0B 00 get_loc_check 11: equationFunction
424 62 0E 00 get_loc_check 14: guess
427 EE call1 1
428 C2 10 put_loc8 16: f
430 38 96 00 00 00 get_var Math
435 42 FC 01 00 00 get_field2 abs
440 62 10 00 get_loc_check 16: f
443 24 01 00 call_method 1
446 62 05 00 get_loc_check 5: tolerance
449 A4 lt
450 69 92 00 00 00 if_false 597
455 61 11 00 set_loc_uninitialized 17: parsedNumber
458 C5 get_loc1 1: parseNumber
459 62 0E 00 get_loc_check 14: guess
462 EE call1 1
463 C2 11 put_loc8 17: parsedNumber
465 38 A3 01 00 00 get_var console
470 42 A2 01 00 00 get_field2 log
475 04 FD 01 00 00 push_atom_value "\u00e6\u0095\u00b4\u00e6\u0095\u00b0\u00e9\u0083\u00a8\u00e5\u0088\u0086:"
480 62 11 00 get_loc_check 17: parsedNumber
483 41 FE 01 00 00 get_field integerPart
488 24 02 00 call_method 2
491 0E drop
492 38 A3 01 00 00 get_var console
497 42 A2 01 00 00 get_field2 log
502 04 FF 01 00 00 push_atom_value "\u00e5\u00b0\u008f\u00e6\u0095\u00b0\u00e9\u0083\u00a8\u00e5\u0088\u0086:"
507 62 11 00 get_loc_check 17: parsedNumber
510 41 00 02 00 00 get_field decimalPart
515 42 37 00 00 00 get_field2 toString
520 24 00 00 call_method 0
523 42 26 01 00 00 get_field2 substr
528 B4 push_0 0
529 BC 0A push_i8 10
531 24 02 00 call_method 2
534 24 02 00 call_method 2
537 0E drop
538 38 96 00 00 00 get_var Math
543 42 01 02 00 00 get_field2 round
548 62 0E 00 get_loc_check 14: guess
551 01 80 96 98 00 push_i32 10000000
556 9B mul
557 24 01 00 call_method 1
560 01 80 96 98 00 push_i32 10000000
565 9C div
566 11 dup
567 63 0D 00 put_loc_check 13: text
570 0E drop
571 04 02 02 00 00 push_atom_value "\u00e6\u0096\u00b9\u00e7\u00a8\u008b\u00e7\u009a\u0084\u00e8\u00a7\u00a3\u00e4\u00b8\u00ba\u00ef\u00bc\u009a\n"
576 62 04 00 get_loc_check 4: unknownVariable
579 9E add
580 04 03 02 00 00 push_atom_value " = "
585 9E add
586 62 0D 00 get_loc_check 13: text
589 9E add
590 11 dup
591 63 0C 00 put_loc_check 12: ans
594 0E drop
595 EB 3F goto8 659
597 62 0B 00 597: get_loc_check 11: equationFunction
600 62 0E 00 get_loc_check 14: guess
603 BE 19 push_const8 25: 1e-13
605 9E add
606 EE call1 1
607 62 10 00 get_loc_check 16: f
610 9F sub
611 BE 1A push_const8 26: 1e-13
613 9C div
614 C2 12 put_loc8 18: df
616 62 0E 00 get_loc_check 14: guess
619 62 10 00 get_loc_check 16: f
622 62 12 00 get_loc_check 18: df
625 9C div
626 9F sub
627 11 dup
628 63 0E 00 put_loc_check 14: guess
631 0E drop
632 38 A3 01 00 00 get_var console
637 42 A2 01 00 00 get_field2 log
642 62 0F 00 get_loc_check 15: i
645 92 post_inc
646 63 0F 00 put_loc_check 15: i
649 62 0E 00 get_loc_check 14: guess
652 24 02 00 call_method 2
655 0E drop
656 EC 02 FF goto16 403
659 38 A3 01 00 00 659: get_var console
664 42 A2 01 00 00 get_field2 log
669 62 0C 00 get_loc_check 12: ans
672 24 01 00 call_method 1
675 0E drop
676 62 0C 00 get_loc_check 12: ans
679 E9 05 if_false8 685
681 62 0C 00 get_loc_check 12: ans
684 28 return
685 04 04 02 00 00 685: push_atom_value "\u00e6\u009c\u00aa\u00e8\u0083\u00bd\u00e6\u0089\u00be\u00e5\u0088\u00b0\u00e6\u0096\u00b9\u00e7\u00a8\u008b\u00e7\u009a\u0084\u00e8\u00a7\u00a3"
690 28 return
691 C6 691: get_loc2 2: arr
692 E8 get_length
693 B4 push_0 0
694 AC strict_eq
695 E9 07 if_false8 703
697 04 05 02 00 00 push_atom_value "\u00e6\u00b2\u0092\u00e6\u009c\u0089\u00e6\u009c\u00aa\u00e7\u009f\u00a5\u00e6\u0095\u00b8"
702 28 return
703 04 06 02 00 00 703: push_atom_value "\u00e7\u009b\u00a1\u00e8\u00ab\u008b\u00e6\u009c\u009f\u00e5\u00be\u0085"
708 28 return
*/
}
this.screen.setProperty(hmUI.prop.MORE, {
text: solveEquation(this.screenData),
});
Error = true;
//this.screenData = "方程式的解为:"+ JSON.stringify(result)
} catch (e) {
this.screen.setProperty(hmUI.prop.MORE, {
text: "請先檢査方程式",
});
Error = true;
}
} else {
for (let i = 0; i < brDiff; i++) this.screenData += ")";
}
if (Error == false) this.updateScreen();
}
_countIncl(str, chr) {
let c = 0;
for (let i in str) if (str[i] === chr) c++;
return c;
}
switchSet() {
const newId = (this.currentSetId + 1) % this.buttonSets.length;
const newSet = this.buttonSets[newId];
for (let i = 0; i < newSet.length; i++) {
this.buttons[i].setProperty(hmUI.prop.TEXT, newSet[i]);
}
this.currentSetId = newId;
this.currentSet = newSet;
}
initButtonEvents(i) {
return () => {
if (i == 11) return this.switchSet();
let val = this.currentSet[i];
if (this.operations[val]) val = this.operations[val];
this.appendScreen(val);
while (this.currentSetId != 0) this.switchSet();
};
}
appendScreen(val) {
this.screenData += val;
this.updateScreen();
}
updateScreen() {
this.screen.setProperty(hmUI.prop.MORE, {
text: this.screenData,
});
}
clear() {
this.screenData = "";
this.updateScreen();
}
backspace() {
let delchar = 1
this.screenData = this.screenData.substring(0, this.screenData.length - delchar);
this.updateScreen();
}
}
// source: /home/melianmiko/Projects/mb7_apps/calculator/entrypoint.js
let __$$app$$__ = __$$hmAppManager$$__.currentApp;
let __$$module$$__ = __$$app$$__.current;
__$$module$$__.module = DeviceRuntimeCore.Page({
onInit() {
hmUI.setLayerScrolling(false);
new Calculator()
.start();
},
});
})();