From WikiChip
Editing mirc/while loops

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|While Loops}}
 
{{mirc title|While Loops}}
In many occasions, you may end up doing a task over and over again in a single script (For example, counting from 0 to 10, or sending a message to multiple people or channels). A '''while loop''' is a control flow statement that allows code to be executed repeatedly based on a given condition. The code inside the while loop block will get executed as long as the condition is true.
+
In many occasions, you may end up doing a task over and over again in a single script (For example, counting from 0 to 10, or sending a message to multiple people or channels). A '''while loop''' is a control flow statement that allows code to be executed repeatedly based on a given condition. The code inside the while loop block will get executed as long as the condition is $true.
  
 
== Syntax ==
 
== Syntax ==
Line 11: Line 11:
 
Here is how the while loop works:
 
Here is how the while loop works:
  
#The conditional statement is checked. $v1 and $v2 are generated according to the condition being evaluated.<br />If the statement is true, continue on to step 2.<br />If the statement is false go to step 4.
+
#The conditional statement is checked.<br />If the statement is true, continue on to step 2.<br />If the statement is false go to step 4.
 
#The code inside the while loop (inside the brackets) is executed.
 
#The code inside the while loop (inside the brackets) is executed.
 
#The entire process starts all over again. Going back to step 1.
 
#The entire process starts all over again. Going back to step 1.
 
#If the statement was false.<br />No code inside the while loop is executed and the script skips right down to any code below it.
 
#If the statement was false.<br />No code inside the while loop is executed and the script skips right down to any code below it.
  
=== true conditions ===
+
=== $true conditions ===
So we said the while loop will continue to iterate as long as the condition is true. But what exactly does that mean? In mSL, a condition is true if the outcome of the condition is NOT 0, {{mIRC|$null}}, or {{mIRC|$false}}. For example let %x be 5, if the condition is while ({{mIRC|$calc}}(%x - 5)) {, since 5-5 is 0, the while loop's condition is false, thus it will not execute any code inside it.
+
So we said the while loop will continue to iterate as long as the condition is $true. But what exactly does that mean? In mSL, a condition is true if the outcome of the condition is NOT 0, $null, or $false. For example let %x be 5, if the condition is while ($calc(%x - 5)) {, since 5-5 is 0, the while loop's condition is false, thus it will not execute any code inside it.
 
 
'''Note''': If you are using an operator, for example while (0 == 0) {, the operator is going to define if the condition is true or not, 0 being equal to 0, this condition is true.
 
  
 
==== Example 1 ====
 
==== Example 1 ====
Line 59: Line 57:
 
== Nested Loops ==
 
== Nested Loops ==
  
A ''nested loop'' is a loop that is situated within the body of the other. In a nested loop, the first iteration of the outer loop causes the inner loop to execute. The inner loop will execute its body as long as its condition is true. Upon completion the outer loop executes again, causing the inner loop to execute again. This sequence of events will keep on executing until the outer loop is complete. There is no limit to how many loops can be nested inside each other.
+
A ''nested loop'' is a loop is situated within the body of the other. In a nested loop, the first iteration of the outer loop causes the inner loop to execute. The inner loop will execute its body as long as its condition is true. Upon completion the outer loop executes again, causing the inner loop to execute again. This sequence of events will keep on executing until the outer loop is complete. There is no limit to how many loops can be nested inside each other.
  
 
Take a look at this example:
 
Take a look at this example:
Line 222: Line 220:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Keeping mIRC responsive ==
+
[[Category:mIRC]]
 
 
Whilst your loops are looping, mIRC is not able to process any other activities such as messages sent from the server or your own keystrokes or mouse clicks. So while loops which loop a lot of times can result in mIRC appearing to lag or be unresponsive.<br>
 
 
 
For these situations there are several techniques you can use to mitigate this:
 
 
 
a. Rather than iterating through a hash table item by item or a custom list window line by line to find what you want, use mIRC functionality to search for what you are seeking i.e. using $hfind, $fline etc.
 
 
 
b. Where mIRC allows it, use the /command parameter for identifiers like $hfind $fline $regsubex etc. or using /filter's -k alias, so that the identifier calls the code to process what you found rather than exiting the find, doing the processing and then re-entering the find again.
 
 
 
For example, if you use $findfile inside a while() loop handling the Nth file individually, mIRC is forced to repeat the disk search N times, while using the /command parameter inside $findfile allows performing the disk search just 1 time.
 
 
 
Note: If you use the /command parameter, mIRC will not be able to process any other messages whilst the identifier and the /commands process and mIRC may become unresponsive for an extended period. If you don't use the /command parameter you can use the next technique to keep mIRC responsive, but at the cost of additional elapsed time to complete the search.
 
 
 
c. Split the loops into smaller chunks and use .timer 0 1 to queue the next chunk of iterations, letting mIRC process any server messages, keystrokes and mouse clicks before running the timer.
 
 
 
d. Make your while() loop more efficient by enabling it to use less overhead. If you are processing the lines in a disk file in a way which can't be accomplished using /filter -k, ensure your while (condition) itself uses fewer resources.
 
 
 
<pre>
 
var %i 0 | while (%line <= $lines(file.txt)) { inc %i | do stuff }
 
var %i 0 , %total $lines(file.txt) | while (%line <= %total) { inc %i | do stuff }
 
</pre>
 
 
 
The 1st alternative will be slower due to repeatedly calculating the same thing.<br>
 
 
 
e. If your while loop is echoing screen output, you can speed up the loop by temporarily (or permanently) setting the /fupdate value to a higher number in the 0-100 range. If your loop is adding lines to a @window, the write is much faster if the window is hidden or minimized.
 

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)