📜 ⬆️ ⬇️

Abnormal programming: a macro interpreter in Notepad ++

swap


Exchange of values. Source text and text after the 1st, 2nd and 3rd run of the macro. Further examples will be more complicated.


The idea of ​​adapting a macro for primitive programming came to me several times. That is, to make the macro “read” the line with the operation at the start, interpret it, do something with the data and move on to the next line.


Just in case, let me remind you: a macro in Notepad ++ and in other text editors is a recorded sequence of user actions on text. Macros can be run multiple times to quickly perform routine operations. The macro "remembers" keystrokes and can reproduce, for example, such actions:



At first it seemed impossible, because the macro is too "stupid" and straightforward:



For the second point there was a solution - Search -> Find (Volatile) Next (Ctrl+Alt+F3) . This operation searches the selection. Thanks to her, you can make a dynamic transition, depending on the selection. But the first point seemed impossible to get around. It turned out that there was no way to execute such code:


 a = 1 if --... 

The macro will not be able to determine that in the first line it is necessary to perform an assignment, and in the second to make a conditional transition. This means that you need to do everything in one operation. Something like this:


 // a:0 // a = 1 goto label1 label1: a = 2 goto label2 

To go to the label, you need to use the search for the selected. But there was such a problem - how to implement a conditional transition. Obviously, you need to go always, but by changing labels:


 [a]:0 a = 1 goto label[a] label1: 

The variable value is substituted for [a] , and label1, label2 or label_hello is obtained. Since the substitution should always be carried out, a service variable [] with an empty value has appeared for an unconditional transition:


 []: [a]:0 a = 1 goto label1[] label1: ... 

Due to the fact that the empty value can not be copied, it was necessary to add a space after the value in all variable storages and delete after substitution. Uncomfortable, but I do not know how to do better. Ultimately, the string from the operations acquired the following form:


 w: w[w]w = w[w[w]w]ww[w]w 

Where w - \w* in a regular expression, i.e. consisting of alphabetic and numeric characters and underscores. The macro 4 times performs the substitution of variables, saves the value of the variable and makes the transition.


The principle of the macro


Consider a simple example.


 label1: b[index] = [a[]] label2[] label2: []: [a]:Hello_world [index]:2 [b2]: 

We believe that the cursor is at the beginning of the first line. Regularly \w*\[\w*\]\w* is searched and allocated the first occurrence, with us this is b[index] . It is copied and pasted at the end of the line after adding >>> :


 label1: b[index] = [a[]] label2[]>>>b[index] 

After \[\w*\] , a colon is added, and [index]: is allocated with a regular schedule. Next comes the search for the next such entry. If everything is correct, then this is the place with the value of the variable. The value is highlighted and copied. Returns are made by searching >>> . Regular is [index]: Instead, the expression is inserted the value of the variable. All the expressions "wrapped" in square brackets and a colon is added to it to further search for the resulting variable name:


 label1: b[index] = [a[]] label2[]>>>[b2]: 

Further it is similar, but a double substitution is performed for the expression on the right side of the equality.


 (1) label1: b[index] = [a[]] label2[]>>>[b2]:>>>[a[]] (2) label1: b[index] = [a[]] label2[]>>>[b2]:>>>[a] (3) label1: b[index] = [a[]] label2[]>>>[b2]:>>>Hello_world 

Writing the value of a variable by the same principle. And, finally, a substitution is made for the name of the label, and a transition occurs over it.


 (1) label1: b[index] = [a[]] label2[]>>>label2[] (1) label2: (2) label1: b[index] = [a[]] label2[]>>>label2 (2) label2: (3) label1: b[index] = [a[]] label2[]>>>label2 (3) >>>label2: (4) label1: b[index] = [a[]] label2[] (4) >>>label2: (5) label1: b[index] = [a[]] label2[] (5) label2: 

You have to mark a transition marker with >>> to remove the garbage at the end of the line.


Examples


Hello, world!


Macro execution loops on the first line.


 label: out[] = Hello_world[[]] label[] [out]:Hello_world []: 

Swap


 l1: t[]=[a[]] l2[] l2: a[]=[b[]] l3[] l3: b[]=[t[]] l1[] []: [a]:World [b]:Hello [t]: 

At the beginning and after three launches of the macro:


swap


Subroutine call


The same swap, only rendered into a separate subroutine. The [[swap_var0]] construction allows to get the value of a variable whose name is in swap_var0.


 l1: swap_var0[] = a[[]] l2[] //  1  l2: swap_var1[] = b[[]] l3[] //  2  l3: swap_ret[] = l1[[]] swap[] //   //    []: [a]:Hello [b]:World ##### Swap [swap_var0]: [swap_var1]: [swap_ret]: swap: _swap_temp[] = [[swap_var0]] _swap_2[] -- private _swap_2: [swap_var0] = [[swap_var1]] _swap_3[] _swap_3: [swap_var1] = [_swap_temp[]] [swap_ret] [_swap_temp]: ##### 

Single-digit decimal increment


 l1: inc__var[] = a[[]] l2[] l2: inc__ret[] = inc__begin[[]] inc__begin[] []: [a]:0 ##### Increment [inc__var]:a [inc__ret]: inc__begin: _inc__val[] = [[inc__var]] _inc[] -- private _inc: [inc__var] = [_inc__map[_inc__val]] [inc__ret] [_inc__val]: [_inc__map0]:1 [_inc__map1]:2 [_inc__map2]:3 [_inc__map3]:4 [_inc__map4]:5 [_inc__map5]:6 [_inc__map6]:7 [_inc__map7]:8 [_inc__map8]:9 [_inc__map9]:0 ##### 

Three-digit decimal increment


When incrementing to transfer to the senior level is required to monitor overflow. Therefore, a second overflow output has been added to the incrementing subroutine. Yes, tags can be placed in a row.


 l01: inc__var[] = a[[]] l02[] l02: inc__ret[] = inc__begin[[]] l03[] l03: inc__over_ret[] = l11[[]] inc__begin[] l11: inc__var[] = b[[]] l12[] l12: inc__ret[] = l01[[]] l13[] l13: inc__over_ret[] = l21[[]] inc__begin[] l21: inc__var[] = c[[]] l22[] l22: inc__ret[] = l01[[]] l23[] l23: inc__over_ret[] = l01[[]] inc__begin[] []: [c]:0 [b]:0 [a]:0 ##### Increment [inc__var]: [inc__ret]: [inc__over_ret]: inc__begin: _inc__val[] = [[inc__var]] _inc[] -- private _inc: [inc__var] = [_inc__map[_inc__val]] i[_inc__val] i0:i1:i2:i3:i4:i5:i6:i7:i8: _inc__val[] = [_inc__val[]] [inc__ret] i9: _inc__val[] = [_inc__val[]] [inc__over_ret] [_inc__val]: [_inc__map0]:1 [_inc__map1]:2 [_inc__map2]:3 [_inc__map3]:4 [_inc__map4]:5 [_inc__map5]:6 [_inc__map6]:7 [_inc__map7]:8 [_inc__map8]:9 [_inc__map9]:0 ##### 

Bubble Sort


Both the size of the array and its possible values ​​are limited from 0 to 9. It works long, but sorts. You can run the macro multiple times and set 2000 iterations, then the execution will take about a minute. The initial implementation of the comparison was very slow - each number was decremented until one of them reached 0. Now it is ugly but relatively fast.


Bubble sorting
 s000: it_remain[] = 8[[]] s010[] s010: index0[] = 8[[]] s020[] s020: index1[] = 9[[]] s030[] // ,    s030: swap_if__var0[] = array[index0[]] s040[] s040: swap_if__var1[] = array[index1[]] s050[] s050: swap_if__ret[] = s060[[]] swap_if__begin[] // 1-  s060: dec__var[] = index1[[]] s070[] s070: dec__ret[] = s100[[]] s080[] s080: dec__zero_ret[] = s100[[]] dec__begin[] // 2-  s100: dec__var[] = index0[[]] s110[] s110: dec__ret[] = s030[[]] s120[] s120: dec__zero_ret[] = s200[[]] dec__begin[] //    s200: dec__var[] = it_remain[[]] s210[] s210: dec__ret[] = s010[[]] s220[] s220: dec__zero_ret[] = finish[[]] dec__begin[] [array0]:5 [array1]:3 [array2]:7 [array3]:3 [array4]:2 [array5]:3 [array6]:1 [array7]:2 [array8]:4 [array9]:1 [index0]: [index1]: [it_remain]: ##### special []: [stub]:stub [finished]:no finish: finished[]=yes[[]] finish[] ##### ##### Swap if not less [swap_if__var0]: [swap_if__var1]: [swap_if__ret]: swap_if__begin: less__val0[] = [[swap_if__var0]] _swap_if1[] -- private _swap_if1: less__val1[] = [[swap_if__var1]] _swap_if2[] _swap_if2: less__ret0[] = [swap_if__ret[]] _swap_if3[] _swap_if3: less__ret1[] = _swap_if4[[]] less__begin[] _swap_if4: _swap__tmp[] = [[swap_if__var0]] _swap_if5[] _swap_if5: [swap_if__var0] = [[swap_if__var1]] _swap_if6[] _swap_if6: [swap_if__var1] = [_swap__tmp[]] [swap_if__ret] [_swap__tmp]: ##### ##### Less [less__val0]: [less__val1]: [less__ret0]: [less__ret1]: less__begin: stub[] = [stub[]] _less__[less__val0] -- private _less__0: stub[] = [stub[]] s0[less__val1] _less__1: stub[] = [stub[]] s1[less__val1] _less__2: stub[] = [stub[]] s2[less__val1] _less__3: stub[] = [stub[]] s3[less__val1] _less__4: stub[] = [stub[]] s4[less__val1] _less__5: stub[] = [stub[]] s5[less__val1] _less__6: stub[] = [stub[]] s6[less__val1] _less__7: stub[] = [stub[]] s7[less__val1] _less__8: stub[] = [stub[]] s8[less__val1] _less__9: stub[] = [stub[]] [less__ret1] s01:s02:s03:s04:s05:s06:s07:s08:s09:s12: stub[] = [stub[]] [less__ret0] s13:s14:s15:s16:s17:s18:s19:s23:s24:s25: stub[] = [stub[]] [less__ret0] s26:s27:s28:s29:s34:s35:s36:s37:s38:s39: stub[] = [stub[]] [less__ret0] s45:s46:s47:s48:s49:s56:s57:s58:s59:s67: stub[] = [stub[]] [less__ret0] s68:s69:s78:s79:s89: stub[] = [stub[]] [less__ret0] s00:s10:s11:s20:s21:s22:s30:s31:s32:s33: stub[] = [stub[]] [less__ret1] s40:s41:s42:s43:s44:s50:s51:s52:s53:s54: stub[] = [stub[]] [less__ret1] s55:s60:s61:s62:s63:s64:s65:s66:s70:s71: stub[] = [stub[]] [less__ret1] s72:s73:s74:s75:s76:s77:s80:s81:s82:s83: stub[] = [stub[]] [less__ret1] s84:s85:s86:s87:s88: stub[] = [stub[]] [less__ret1] ##### ##### Decrement [dec__var]: [dec__ret]: [dec__zero_ret]: dec__begin: _dec__val[] = [[dec__var]] d[_dec__val] -- private d1:d2:d3:d4:d5:d6:d7:d8:d9: [dec__var] = [_dec__map[_dec__val]] [dec__ret] d0: [dec__var] = [_dec__map[_dec__val]] [dec__zero_ret] [_dec__val]: [_dec__map0]:9 [_dec__map1]:0 [_dec__map2]:1 [_dec__map3]:2 [_dec__map4]:3 [_dec__map5]:4 [_dec__map6]:5 [_dec__map7]:6 [_dec__map8]:7 [_dec__map9]:8 ##### 

Installation


If you suddenly wanted to try, then in the <Macros> element of the file %APPDATA%/Notepad++/shortcuts.xml need to insert:


Macro code
  <Macro name="npplang" Ctrl="yes" Alt="yes" Shift="yes" Key="69"> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\w*\[\w*\]\w*" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2451" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2326" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="[" /> <Action type="0" message="2451" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="]" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="0" message="2453" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\w*\[\w*\[\w*\]\w*\]\w*" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2451" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2326" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2326" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=" " /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2304" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2180" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2453" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\w*\[\w*\]\w*" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\w*\[\w*\]\w*" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\w*\[\w*\]\w*" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2451" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2178" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\[\w*\]:" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2179" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2326" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2451" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam=":" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2306" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="2" message="0" wParam="43014" lParam="0" sParam="" /> <Action type="0" message="2304" wParam="0" lParam="0" sParam="" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="1" message="2170" wParam="0" lParam="0" sParam="&gt;" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="256" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2452" wParam="0" lParam="0" sParam="" /> <Action type="0" message="2180" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="&gt;&gt;&gt;" /> <Action type="3" message="1625" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="768" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1" sParam="" /> <Action type="0" message="2180" wParam="0" lParam="0" sParam="" /> </Macro> 

Macros are launched by pressing Ctrl+Shift+Alt+E


Conclusion


There was a thought to create a stack in order to move away from global variables. Then it would be possible to implement recursion, for example. , . , , .


')

Source: https://habr.com/ru/post/324314/


All Articles