From WikiChip
Editing mirc/identifiers/$*
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
This page supports semantic in-text annotations (e.g. "[[Is specified as::World Heritage Site]]") to build structured and queryable content provided by Semantic MediaWiki. For a comprehensive description on how to use annotations or the #ask parser function, please have a look at the getting started, in-text annotation, or inline queries help pages.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | + | The '''$*''' allows you to iterate over all of the tokens contained within $1-. The way this works is much like a while loop. $* has been omitted from the help file since while loops were introduced. | |
− | + | $* is extremely powerful, because it is much faster than using a while loop on a list of tokens. Understanding how this works is pretty simple, so consider the following: | |
<syntaxhighlight lang="mIRC">var %list a b c d,%a 1 | <syntaxhighlight lang="mIRC">var %list a b c d,%a 1 | ||
while ($gettok(%list,%a,32)) { | while ($gettok(%list,%a,32)) { | ||
− | + | echo -a $v1 | |
− | + | inc %a | |
}</syntaxhighlight> | }</syntaxhighlight> | ||
This can be written as: | This can be written as: | ||
<syntaxhighlight lang="mIRC">tokenize 32 a b c d | echo -a $*</syntaxhighlight> | <syntaxhighlight lang="mIRC">tokenize 32 a b c d | echo -a $*</syntaxhighlight> | ||
− | |||
The above is much smaller, and a lot faster. Pretty cool, isn't it? | The above is much smaller, and a lot faster. Pretty cool, isn't it? | ||
== Notes & quirks == | == Notes & quirks == | ||
− | Why was the | + | Why was the $* identifier removed from the help file in the first place? Well, $* was removed because it does not really work the same way that the other identifiers do, and because it is quirky. |
Quirky? Quirky, how? | Quirky? Quirky, how? | ||
− | Well, mIRC takes the command | + | Well, mIRC takes the command $* appears in, and replace all of the occurrences in the line by a special marker: `~$*: You can see that by doing for example: |
<syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $left($*,1) $+ $chr(3) $+ $mid($*,2)</syntaxhighlight> | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $left($*,1) $+ $chr(3) $+ $mid($*,2)</syntaxhighlight> | ||
− | + | Let's take a look at this and understand why the above return such a value: | |
<syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $mid($*,2)</syntaxhighlight> | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $mid($*,2)</syntaxhighlight> | ||
− | Why isn't this returning bcd? Because of the usage of the special marker | + | Why isn't this returning bcd? Because of the usage of the special marker `~$*, mIRC has stored that the command is actually "echo -a $mid(`~$*,2)". |
+ | |||
+ | Then, for each token, (here only $1 == abcd), mIRC evaluates the line, here $mid(`~$*,2) becomes ~$*, and then mIRC replaces the marker by the token and executes the echo command. However, after an operation, like $mid here, that marker cannot be found; | ||
− | + | Basically, it cannot be guaranteed to get the correct value of $* inside an identifier. | |
− | There is a workaround for the above issue, and that is by using scid and scon: | + | There is a workaround for the above issue, and that workaround is by using scid and scon: |
<syntaxhighlight lang="mIRC">//tokenize 32 abcd | scon -r echo -a $!mid( $* ,2)</syntaxhighlight> | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | scon -r echo -a $!mid( $* ,2)</syntaxhighlight> | ||
− | + | mIRC replaces $* by the marker, but scon has an extra evaluation system which fits perfectly. The $* mechanism is enabled on scon, and mIRC stores the command of the $* as "scon -r echo -a $!mid( `~$* ,2)" | |
− | + | Then, mIRC evaluates the line for each token, which then becomes: "scon -r echo -a $mid( abcd ,2)", and finally the scon command is executed, resulting in the expected value being echoed. | |
− | Another issue is that you cannot call | + | Another issue is that you cannot call $* more than once in the same scope; the command will simply be skipped. However, this can also be circumvented/worked-around :) |
− | Simply retokenize after using | + | Simply retokenize after using $*, which forces the update of $1-, $* can be used again, but only if the number of tokens passed is higher than the previous number of tokens passed. $* will only start from the previous number of tokens + 1: |
− | |||
<syntaxhighlight lang="mIRC">//tokenize 32 1 2 3 | echo -a $* | tokenize 32 4 5 6 7 8 | echo -a $* | echo -a here</syntaxhighlight> | <syntaxhighlight lang="mIRC">//tokenize 32 1 2 3 | echo -a $* | tokenize 32 4 5 6 7 8 | echo -a $* | echo -a here</syntaxhighlight> | ||
− | The first three tokens of the second tokenize, "4 5 6", are dummy tokens which are passed to fill in the gap. | + | The first three tokens of the second tokenize, "4 5 6", are dummy tokens which are passed to fill in the gap. $1- can be used in front of the next tokenize command in order to start from those new tokens, much like a normal situation. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |