Maroonbells (talk | contribs) (Created page with "{{mirc title|$~ Identifier}}'''$~''' is a construct which allows you to call a built-in identifier while both bypassing custom identifier in their absence, and avoiding the id...") |
|||
Line 1: | Line 1: | ||
− | {{mirc title|$~ Identifier}}'''$~''' is a construct which allows you to call | + | {{mirc title|$~ Identifier}}'''$~''' is a construct which allows you to call built-in identifiers only, custom aliases are not checked. This conveniently avoids the identifier warning message and halting behavior. Returns the result of the built-in identifier call, or $null (see the notes) |
− | |||
− | |||
== Synopsis == | == Synopsis == | ||
− | <pre>$~</pre> | + | <pre>$~identifiername()</pre> |
== Parameters == | == Parameters == | ||
None | None | ||
− | == Examples == | + | == Notes & Examples == |
+ | |||
+ | It's unclear still why this undocumented construct exists. Khaled stated that this should not be used in scripts, that it changes the way the paramater are parsed. But a look at a decompiled mirc.exe says otherwise, the only thing it does is prevent custom aliases from being checked. | ||
+ | |||
+ | As a result, the identifier warning message is not triggered and the script not halted if you call an identifier that is not a built-in identifier of mIRC. | ||
+ | |||
+ | This can effectively be used to check for existence of a built-in identifier, be it if you want to do something once a future version has the identifier, or if you want to support older mirc version not having a built-in identifier. This has recently proven to be useful to write mIRC/Adiirc compatible script. | ||
+ | |||
<source lang="mIRC"> | <source lang="mIRC"> | ||
− | + | ||
//echo -a $~rands(1,6) vs $rands(1,6) | //echo -a $~rands(1,6) vs $rands(1,6) | ||
− | + | if ($~rands(1,1) == 1) { echo -sg this version support $!rands } | |
− | + | ||
</source> | </source> | ||
− | + | However, recently it was figured out that $~ have a purpose that makes more sense, and that's local identifiers, one that only have a value in specific mIRC events. | |
+ | Because such identifier have a global scope, they have a value inside an alias if that alias is called from the event's scope. | ||
+ | So consider for example a script that's going to be shared on different mIRC configuration/install/machine: | ||
− | + | <source lang="mIRC"> | |
− | <source lang="mIRC"> | + | on *:text:*:#:process_message $1- |
− | + | on *:input:#:processs_message $1- | |
− | + | alias process_message { | |
− | + | var %nick $iif($nick,$nick,$me) | |
+ | .... | ||
+ | } | ||
</source> | </source> | ||
− | + | which is typical, if you load this script into a mIRC which has a custom alias named "me" returning "test" for example, this script would fail, %nick would incorrectly take the value "test" for your on input. This is where $~ is useful, using $~nick would actually ensure that if $nick has a value, then this value can only come from the event specific identifier and never a custom aliases, indeed preventing conflicts. | |
+ | |||
+ | Another thing to consider is the spacing, if the $~identifier call is not a built-in and you have some spacing, consider: | ||
+ | |||
<source lang="mIRC"> | <source lang="mIRC"> | ||
− | + | echo -ag $~nonbuilt-in( $me ) | |
+ | ;displays "yournickname )" | ||
</source> | </source> | ||
+ | in this case only the part up to the space is evaluated as $null, the rest of the line is not touched and will evaluate normally. | ||
+ | |||
+ | This means that to correctly check if an identifier is supported, you must not use space: | ||
+ | |||
+ | <source lang="mIRC"> | ||
+ | if ($~rands(1,1) == 1) { echo -sg this version support $!rands } // correct | ||
+ | if ($~rands(1, 1) == 1) { echo -sg this version support $!rands } // incorrect | ||
+ | </source> | ||
+ | as it will now act as 'if ( 1) == 1)' on a version not supporting $rands, instead of 'if ($null == 1)' | ||
== Compatibility == | == Compatibility == | ||
− | Version added: | + | Version added: 6.0 |
== See Also == | == See Also == | ||
− |
Latest revision as of 05:48, 23 February 2023
$~ is a construct which allows you to call built-in identifiers only, custom aliases are not checked. This conveniently avoids the identifier warning message and halting behavior. Returns the result of the built-in identifier call, or $null (see the notes)
Synopsis[edit]
$~identifiername()
Parameters[edit]
None
Notes & Examples[edit]
It's unclear still why this undocumented construct exists. Khaled stated that this should not be used in scripts, that it changes the way the paramater are parsed. But a look at a decompiled mirc.exe says otherwise, the only thing it does is prevent custom aliases from being checked.
As a result, the identifier warning message is not triggered and the script not halted if you call an identifier that is not a built-in identifier of mIRC.
This can effectively be used to check for existence of a built-in identifier, be it if you want to do something once a future version has the identifier, or if you want to support older mirc version not having a built-in identifier. This has recently proven to be useful to write mIRC/Adiirc compatible script.
//echo -a $~rands(1,6) vs $rands(1,6) if ($~rands(1,1) == 1) { echo -sg this version support $!rands }
However, recently it was figured out that $~ have a purpose that makes more sense, and that's local identifiers, one that only have a value in specific mIRC events. Because such identifier have a global scope, they have a value inside an alias if that alias is called from the event's scope. So consider for example a script that's going to be shared on different mIRC configuration/install/machine:
on *:text:*:#:process_message $1- on *:input:#:processs_message $1- alias process_message { var %nick $iif($nick,$nick,$me) .... }
which is typical, if you load this script into a mIRC which has a custom alias named "me" returning "test" for example, this script would fail, %nick would incorrectly take the value "test" for your on input. This is where $~ is useful, using $~nick would actually ensure that if $nick has a value, then this value can only come from the event specific identifier and never a custom aliases, indeed preventing conflicts.
Another thing to consider is the spacing, if the $~identifier call is not a built-in and you have some spacing, consider:
echo -ag $~nonbuilt-in( $me ) ;displays "yournickname )"
in this case only the part up to the space is evaluated as $null, the rest of the line is not touched and will evaluate normally.
This means that to correctly check if an identifier is supported, you must not use space:
if ($~rands(1,1) == 1) { echo -sg this version support $!rands } // correct if ($~rands(1, 1) == 1) { echo -sg this version support $!rands } // incorrect
as it will now act as 'if ( 1) == 1)' on a version not supporting $rands, instead of 'if ($null == 1)'
Compatibility[edit]
Version added: 6.0