From WikiChip
Editing mirc/goto statements

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:
{{mirc title|Goto Statements}}
+
{{mIRC Guide}}
 
'''Goto''' is a command that allows you to jump unconditionally to a specific location within a procedure. Gotos can 'jump' forward or backward within a script but they may not leave the alias or event itself (they cannot jump to any calling routine as well). The goto command tells mIRC to jump to another line which matches a label.
 
'''Goto''' is a command that allows you to jump unconditionally to a specific location within a procedure. Gotos can 'jump' forward or backward within a script but they may not leave the alias or event itself (they cannot jump to any calling routine as well). The goto command tells mIRC to jump to another line which matches a label.
+
 
 
Although in many cases the use of gotos can often lead to [[Wikipedia:spaghetti-code|spaghetti-code]]. and can usually be replaced with easier to read and follow [[While Loops - mIRC|while statements]] and [[Conditional statements - mIRC|if statements]], it is still important to understand this command and have it in your toolbox.
 
Although in many cases the use of gotos can often lead to [[Wikipedia:spaghetti-code|spaghetti-code]]. and can usually be replaced with easier to read and follow [[While Loops - mIRC|while statements]] and [[Conditional statements - mIRC|if statements]], it is still important to understand this command and have it in your toolbox.
  
Line 14: Line 14:
  
 
The label has to start with the colon symbol (:) and must be a single word.</p>
 
The label has to start with the colon symbol (:) and must be a single word.</p>
 
== Jumping ==
 
 
There is a neat difference in the way mIRC jumps backward and the way it jumps forward.
 
To get mIRC to reach a goto label that is before the current position, mIRC must has seen that goto label, for example:
 
<syntaxhighlight lang="mirc">
 
alias test {
 
if (a == b) {
 
  :label
 
}
 
goto label
 
}
 
</syntaxhighlight>
 
displays "* /goto: 'label' not found (line N, script.mrc)"
 
since the condition does not get executed, the goto label is not seen by mIRC.
 
 
Change the code to:
 
<syntaxhighlight lang="mirc">
 
alias test {
 
if (a == a) {
 
  :label
 
  inc -us %test
 
if (%test == 2) return
 
}
 
goto label
 
}
 
</syntaxhighlight>
 
Now the goto is seen by mIRC and you should see %test being increased to 1 and then to 2.
 
 
To get mIRC to jump to a goto label that is after the current position, this is less strict: mIRC parse the code without executing it, which means it is basically parsing the code according to major rules defining the language, the '{', '}', '|' and newlines tokens. so considering the following:
 
<syntaxhighlight lang="mirc">
 
alias test {
 
goto label
 
if (a == b) {
 
  :label
 
  inc -us %test
 
if (%test == 2) return
 
}
 
goto label
 
}
 
</syntaxhighlight>The first /goto label statement gets mIRC to parse the rest as token, probably just words, and :label is found despite the if statement being false, %test is increased to 1 and then to 2, proving that the label is found from the first time with the first goto label (forward jump) and then backward since the label was found the first time.
 
  
 
== Conditional transfer of control ==
 
== Conditional transfer of control ==
Line 85: Line 44:
 
== Error Handling ==
 
== Error Handling ==
 
Although it is rare to use this feature, the "error" label is a designated goto section for error checking.
 
Although it is rare to use this feature, the "error" label is a designated goto section for error checking.
 +
 
If there is an error in the script, mIRC try to find an :error label in the current routine.
 
If there is an error in the script, mIRC try to find an :error label in the current routine.
 
If no :error label is found in the current routine, mIRC will propagate the error backward to any calling routine and look for an :error label in those routines.
 
If no :error label is found in the current routine, mIRC will propagate the error backward to any calling routine and look for an :error label in those routines.
  
 
+
This gives you the ability to continue with the script regardless of the error if you want.
This gives you the ability to continue with the script at any point regardless of the error, if you want.
 
 
 
  
 
After catching an error with :error, you must check for an error by checking $error with a typical /if statement to make sure you reached the :error part because of an error and not because the script is just reaching that point.
 
After catching an error with :error, you must check for an error by checking $error with a typical /if statement to make sure you reached the :error part because of an error and not because the script is just reaching that point.
  
 
If you want to keep going with the code, use /reseterror as soon as possible, this reset the error (and therefore $error's value), mIRC leaves the error state and you can safely execute anything you want.
 
If you want to keep going with the code, use /reseterror as soon as possible, this reset the error (and therefore $error's value), mIRC leaves the error state and you can safely execute anything you want.
 +
If you try to execute anything else than /reseterror after reaching an :error label because of an error, mIRC can broke (see examples).
 +
Indeed, here mIRC is in an error state, yet it must still process your code somehow to allow you to *at least* check for error and reset it, so it's unclear what you can do and what you can't do besides an if statement on $error followed by /reseterror. You would think that since mIRC is somehow forced to allow you to use the scripting engine to check for error and reset it, you could be able to do anything even without calling /reseterror first (still after checking for $error), this is not true, the exact list of features that are working in this situation are unknown, it's recommended not to do anything before using /reseterror in this situation.
  
If you don't use /reseterror, you can also use /return to tell mIRC to look for a different :error label in previous routines.
+
<syntaxhighlight lang="mirc">Alias Example {
If you don't use /reseterror or /return you must be careful:
+
  /*
mIRC is in an error state, yet it must still process your code somehow to allow you to *at least* check for error and reset it, so the if statement feature probably always works, /echo itself also probably does always work but it's unclear what you can do and what you can't do. You would think that since mIRC is somehow forced to allow you to use the scripting engine to check for error and reset it, you could be able to do anything even without calling /reseterror first, this is not true (see examples), the exact list of features that are working in this situation are unknown, it's recommended not to do anything before using /reseterror in this situation.
+
     Second parameters of the $rand identifier is missing.
 
+
    Deliberate Error
<syntaxhighlight lang="mirc">
+
  */
/* EXAMPLE 1
 
     This typical example shows that after reaching :error and without using /reseterror, /echo itself works, but see the next example, a lot of simple operation might be done there.
 
    Since we don't halt or reset the error, mIRC will display both our echo and its own error for $rand.
 
*/
 
Alias Example {
 
 
   echo -a $rand(1,)
 
   echo -a $rand(1,)
 
   return
 
   return
Line 111: Line 66:
 
   echo -a Error: $error
 
   echo -a Error: $error
 
}
 
}
/* EXAMPLE 2
+
;In this case, we try to execute something else than /reseterror after reaching :error, for some reasons, that $regsubex gets mIRC to silentely halts while inside a routine, you should get the first echo 'ok' and an echo '> $str(ab,2000)' is expected but you shouldn't see it.
  In this case, we try to execute /echo again after a /if error, but on $regsubex, for some reasons, that $regsubex gets mIRC to silentely halts while inside a routine.
+
 
  You should get the first echo 'ok' and an echo '> $str(ab,2000)' is expected, but you shouldn't see it.
 
  Use /reseterror first and it works as expected.
 
*/
 
 
alias testgoto {
 
alias testgoto {
 
   if
 
   if
 
   :error
 
   :error
 
   echo -a ok | echo -a > $regsubex($str(ab,2000),/(a*)b*(a*)*b/,)
 
   echo -a ok | echo -a > $regsubex($str(ab,2000),/(a*)b*(a*)*b/,)
}
 
/* EXAMPLE 3
 
Although this example might look a little confusing, bear with me:
 
Calling alias /Foo will echo what alias FooBar returns.
 
Alias foobar will return what alias bar returns.
 
Because alias bar errors out (since $mid is missing a few parameters), mIRC will look for an :error label in alias Bar but won't find any.
 
So it will look in the previous routine, the alias FooBar. an :error label is found in the alias FooBar.
 
It is executed, echoing Error followed by the error message and returning 1000 to alias foo.
 
The /reseterror command effectively prevents mIRC from halting the script and allows it to finish executing.
 
*/
 
 
Alias Foo {
 
  echo -a $FooBar
 
}
 
Alias Bar {
 
  return $mid($1)
 
}
 
Alias FooBar {
 
  return $Bar(Example)
 
  :error
 
  echo -a Error Using Value 1000 instead! ( $+ $error $+ )
 
  reseterror
 
  return 1000
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
[[Category:mIRC|goto]]
 

Please note that all contributions to WikiChip may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see WikiChip:Copyrights for details). Do not submit copyrighted work without permission!

Cancel | Editing help (opens in new window)