📄 preproc.html
字号:
<blockquote class="code"><pre>
db <font color=#bb0000>'name: 1'</font><font color=#333399>,</font><font color=#339933>0</font>
db <font color=#bb0000>'name: barfoo'</font><font color=#333399>,</font><font color=#339933>0</font>
</pre></blockquote>
this is usefull when passing argument from macro to macro:
<blockquote class="code"><pre>
macro pushstring string
<font color=#333399>{</font>
local ..behind
call ..behind
db string<font color=#333399>,</font><font color=#339933>0</font>
..behind<font color=#333399>:</font>
<font color=#333399>}</font>
macro debug string
<font color=#333399>{</font>
push MB_OK
push <font color=#339933>0</font> <font color=#777777>;empty caption</font>
pushstring <font color=#bb0000>'debug: '</font><font color=#333399>#</font>string <font color=#777777>;"pushstring" takes one argument</font>
push <font color=#339933>0</font> <font color=#777777>;no partent window</font>
call <font color=#333399>[</font>MessageBox<font color=#333399>]</font>
<font color=#333399>}</font>
</pre></blockquote>
<br>
Note that you can't use <code>#</code> in arguments of <code>local</code>, because <code>local</code> is processed
before <code>#</code>. For that reason, code like this won't work:
<blockquote class="code"><pre>
macro a arg
<font color=#333399>{</font>
local name_<font color=#333399>#</font>arg
<font color=#333399>}</font>
a foo
</pre></blockquote>
<br><br>
<a name="to_string"></a>
<b>5.5. Operator <code>`</code></b><br>
There is also operator <code>`</code> which transfers symbol following it to quoted
string. This operator can be used only inside macro.
<br><br>
Example:
<blockquote class="code"><pre>
macro proc name
<font color=#333399>{</font>
name<font color=#333399>:</font>
log <font color=#333399>`</font>name <font color=#777777>;log can be some macro which takes string as argument</font>
<font color=#333399>}</font>
proc DummyProc
</pre></blockquote>
to
<blockquote class="code"><pre>
DummyProc<font color=#333399>:</font>
log <font color=#bb0000>'DummyProc'</font>
</pre></blockquote>
<br>
Or one little more complicated example using <code>#</code>:
<blockquote class="code"><pre>
macro proc name
<font color=#333399>{</font>
name<font color=#333399>:</font>
log <font color=#bb0000>'entering procedure: '</font><font color=#333399>#`</font>name
<font color=#333399>}</font>
proc DummyProc
retn
proc Proc2
retn
</pre></blockquote>
to
<blockquote class="code"><pre>
DummyProc<font color=#333399>:</font>
log <font color=#bb0000>'entering procedure: DummyProc'</font>
retn
Proc2<font color=#333399>:</font>
log <font color=#bb0000>'entering procedure: Proc2'</font>
retn
</pre></blockquote>
<br><br><br>
<a name="group_mac"></a>
<b>6. Macros with group argument</b><br><br>
<a name="group_arg"></a>
<b>6.1. Declaring macro with group argument</b><br>
Macros can have so-called "group argument". It allows you non-fixed number of
arguments. Group argument is enclosed in brackets <code>[</code>,<code>]</code>
in macro definition:
<blockquote class="code"><pre>
macro name arg1<font color=#333399>,</font>arg2<font color=#333399>,[</font>grouparg<font color=#333399>]</font>
<font color=#333399>{</font>
<font color=#333399><</font>body<font color=#333399>></font>
<font color=#333399>}</font>
</pre></blockquote>
<br>
Group argument must be last argument in macro defintion. Group argument can
contain multiple arguments, like:
<blockquote class="code"><pre>
macro name arg1<font color=#333399>,</font>arg2<font color=#333399>,[</font>grouparg<font color=#333399>]</font> <font color=#333399>{}</font>
name <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font><font color=#333399>,</font><font color=#339933>5</font><font color=#333399>,</font><font color=#339933>6</font>
</pre></blockquote>
here value of group argument (<code>grouparg</code>) are values 3,4,5 and 6. 1 and 2
are values of <code>arg1</code> and <code>arg2</code>.<br><br><br>
<a name="common"></a>
<b>6.2. Directive <code>common</code></b><br>
To work with group arguments, you use some preprocessor directives. These
directives can be used only in body of macro with group argument. First such
directive is <code>common</code>. It means that behind this directive group argument
name in macro body will be replaced by all arguments:
<blockquote class="code"><pre>
macro string <font color=#333399>[</font>grp<font color=#333399>]</font>
<font color=#333399>{</font>
common
db grp<font color=#333399>,</font><font color=#339933>0</font>
<font color=#333399>}</font>
string <font color=#bb0000>'aaaaaa'</font>
string <font color=#bb0000>'line1'</font><font color=#333399>,</font><font color=#339933>13</font><font color=#333399>,</font><font color=#339933>10</font><font color=#333399>,<font color=#bb0000>'line2'</font></font>
string <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font><font color=#333399>,</font><font color=#339933>5</font>
</pre></blockquote>
to
<blockquote class="code"><pre>
db <font color=#bb0000>'aaaaaa'</font><font color=#333399>,</font><font color=#339933>0</font>
db <font color=#bb0000>'line1'</font><font color=#333399>,</font><font color=#339933>13</font><font color=#333399>,</font><font color=#339933>10</font><font color=#333399>,<font color=#bb0000>'line2'</font>,</font><font color=#339933>0</font>
db <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font><font color=#333399>,</font><font color=#339933>5</font><font color=#333399>,</font><font color=#339933>0</font>
</pre></blockquote>
<br><br>
<a name="forward"></a>
<b>6.3. Directive <code>forward</code></b><br>
But you can work with arguments in group argument separately. For this
<code>forward</code> preprocessor directive is used. Part of macro body behind forward
directive is preprocessed for each argument in group argument:
<blockquote class="code"><pre>
macro a arg1<font color=#333399>,[</font>grparg<font color=#333399>]</font>
<font color=#333399>{</font>
forward
db arg1
db grparg
<font color=#333399>}</font>
a <font color=#339933>1</font><font color=#333399>,<font color=#bb0000>'a'</font>,<font color=#bb0000>'b'</font>,<font color=#bb0000>'c'</font></font>
a <font color=#333399>-</font><font color=#339933>1</font><font color=#333399>,</font><font color=#339933>10</font><font color=#333399>,</font><font color=#339933>20</font>
</pre></blockquote>
to
<blockquote class="code"><pre>
db <font color=#339933>1</font>
db <font color=#bb0000>'a'</font>
db <font color=#339933>1</font>
db <font color=#bb0000>'b'</font>
db <font color=#339933>1</font>
db <font color=#bb0000>'c'</font>
db <font color=#333399>-</font><font color=#339933>1</font>
db <font color=#339933>10</font>
db <font color=#333399>-</font><font color=#339933>1</font>
db <font color=#339933>20</font>
</pre></blockquote>
<br>
<code>forward</code> is default for macros with group arguments, so previous macro can
as well be
<blockquote class="code"><pre>
macro a arg1<font color=#333399>,[</font>grparg<font color=#333399>]</font>
<font color=#333399>{</font>
db arg1
db grparg
<font color=#333399>}</font>
</pre></blockquote>
<br><br>
<a name="reverse"></a>
<b>6.4. Directive <code>reverse</code></b><br>
<code>reverse</code> is same as <code>forward</code>, but processess arguments
in group argument from last to first:
<blockquote class="code"><pre>
macro a arg1<font color=#333399>,[</font>grparg<font color=#333399>]</font>
<font color=#333399>{</font>
reverse
db arg1
db grparg
<font color=#333399>}</font>
a <font color=#339933>1</font><font color=#333399>,<font color=#bb0000>'a'</font>,<font color=#bb0000>'b'</font>,<font color=#bb0000>'c'</font></font>
</pre></blockquote>
to
<blockquote class="code"><pre>
db <font color=#339933>1</font>
db <font color=#bb0000>'c'</font>
db <font color=#339933>1</font>
db <font color=#bb0000>'b'</font>
db <font color=#339933>1</font>
db <font color=#bb0000>'a'</font>
</pre></blockquote>
<br><br>
<a name="combine"></a>
<b>6.5. Combining group control directives</b><br>
These 3 directives divide macro to blocks. Each block is processed after
previous one. For example:
<blockquote class="code"><pre>
macro a <font color=#333399>[</font>grparg<font color=#333399>]</font>
<font color=#333399>{</font>
forward
f_<font color=#333399>#</font>grparg<font color=#333399>:</font> <font color=#777777>;symbol concatenation operator #, see chapter 4.4</font>
common
db grparg
reverse
r_<font color=#333399>#</font>grparg<font color=#333399>:</font>
<font color=#333399>}</font>
a <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font>
</pre></blockquote>
to
<blockquote class="code"><pre>
f_1<font color=#333399>:</font>
f_2<font color=#333399>:</font>
f_3<font color=#333399>:</font>
f_4<font color=#333399>:</font>
db <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font>
r_4<font color=#333399>:</font>
r_3<font color=#333399>:</font>
r_2<font color=#333399>:</font>
r_1<font color=#333399>:</font>
</pre></blockquote>
<br><br>
<a name="localgrp"></a>
<b>6.6. Behavior of directive <code>local</code> inside macro with group
argument</b><br>
There is one more very nice feature with labels local to macro (listed
with <code>local</code> preprocessor directive, see chapter 4.3). If
<code>local</code> directive is defined inside <code>forward</code> or
<code>reverse</code> block, then unique label is defined for each argument in
group, and same labels are used for theirs arguments in following
<code>forward</code> or <code>reverse</code> blocks. Example:
<blockquote class="code"><pre>
macro string_table <font color=#333399>[</font>string<font color=#333399>]</font>
<font color=#333399>{</font>
forward <font color=#777777>;table of pointers to strings</font>
local addr <font color=#777777>;declare label for this string as local</font>
dd addr <font color=#777777>;pointer to string</font>
forward <font color=#777777>;strings</font>
addr db string<font color=#333399>,</font><font color=#339933>0</font>
<font color=#333399>}</font>
string_table <font color=#bb0000>'aaaaa'</font><font color=#333399>,<font color=#bb0000>'bbbbbb'</font>,<font color=#bb0000>'5'</font></font>
</pre></blockquote>
to
<blockquote class="code"><pre>
dd addr<font color=#333399>?</font><font color=#339933>00000001</font>
dd addr<font color=#333399>?</font><font color=#339933>00000002</font>
dd addr<font color=#333399>?</font><font color=#339933>00000003</font>
addr<font color=#333399>?</font><font color=#339933>00000001</font> db <font color=#bb0000>'aaaaa'</font><font color=#333399>,</font><font color=#339933>0</font>
addr<font color=#333399>?</font><font color=#339933>00000002</font> db <font color=#bb0000>'bbbbbb'</font><font color=#333399>,</font><font color=#339933>0</font>
addr<font color=#333399>?</font><font color=#339933>00000003</font> db <font color=#bb0000>'5'</font><font color=#333399>,</font><font color=#339933>0</font>
</pre></blockquote>
<br>
Another example, with <code>reverse</code> block:
<blockquote class="code"><pre>
macro a <font color=#333399>[</font>x<font color=#333399>]</font>
<font color=#333399>{</font>
forward
local here
here db x
reverse
dd here
<font color=#333399>}</font>
a <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font>
</pre></blockquote>
to
<blockquote class="code"><pre>
here<font color=#333399>?</font><font color=#339933>00000001</font> db <font color=#339933>1</font>
here<font color=#333399>?</font><font color=#339933>00000002</font> db <font color=#339933>2</font>
here<font color=#333399>?</font><font color=#339933>00000003</font> db <font color=#339933>3</font>
dd here<font color=#333399>?</font><font color=#339933>00000003</font>
dd here<font color=#333399>?</font><font color=#339933>00000002</font>
dd here<font color=#333399>?</font><font color=#339933>00000001</font>
</pre></blockquote>
so labels will be used with same arguments in both <code>forward</code> and
<code>reverse</code> blocks.<br><br><br>
<a name="multiple"></a>
<b>6.7. Macro with multiple group arguments</b><br>
You can also have more multiple arguments. In that case macro definition
wont look like
<blockquote class="code"><pre>
macro a <font color=#333399>[</font>grp1<font color=#333399>],[</font>grp2<font color=#333399>]</font>
</pre></blockquote>
because then it would be unclear which arguments belong to which group.
For that reason you declare them like:
<blockquote class="code"><pre>
macro a <font color=#333399>[</font>grp1<font color=#333399>,</font>grp2<font color=#333399>]</font>
</pre></blockquote>
here every odd argument belongs to grp1, every even to grp2.<br><br>
Example:
<blockquote class="code"><pre>
macro a <font color=#333399>[</font>grp1<font color=#333399>,</font>grp2<font color=#333399>]</font>
<font color=#333399>{</font>
forward
l_<font color=#333399>#</font>grp1<font color=#333399>:</font>
forward
l_<font color=#333399>#</font>grp2<font color=#333399>:</font>
<font color=#333399>}</font>
a <font color=#339933>1</font><font color=#333399>,</font><font color=#339933>2</font><font color=#333399>,</font><font color=#339933>3</font><font color=#333399>,</font><font color=#339933>4</font><font color=#333399>,</font><font color=#339933>5</font><font color=#333399>,</font><font color=#339933>6</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -