Difference between revisions of "For"

From Second Life Wiki
Jump to navigation Jump to search
(Updated examples.)
 
(14 intermediate revisions by 9 users not shown)
Line 2: Line 2:
|statement=for
|statement=for
|statement_header
|statement_header
|statement_desc=Any of the statements can be null statements.
|statement_desc=Only the condition is required. The initializer, increment, and loop body are optional and can be left empty.
|statement_end=loop
|statement_end=loop
|statement_end_desc=Can be either a single statement, a block statement, or a null statement.
|statement_end_desc=Can be either a single statement, a block statement, or a null statement.
Line 11: Line 11:
|spec
|spec
|caveats
|caveats
|examples=<pre>//single statement type.
|examples=
The following is the most common way a for-loop is written, with each part properly specified.
 
The loop will run or "iterate" 10 times, from 0 to 9. It will execute two statements each iteration.
<source lang="lsl2">
integer a = 0;
integer a = 0;
integer b = 10;
integer b = 10;
for(; a < b; ++a)
for (a = 0; a < b; ++a)
     llOwnerSay((string)a);
{
</pre>
     llOwnerSay( (string)a ); // first statement
<pre>//block statement
    llOwnerSay( (string)b ); // second statement
}
</source>
 
The following is less common, where the curly braces are left out.
 
This can be used when only one statement needs to be executed during the loop.
<source lang="lsl2">
integer a = 0;
integer a = 0;
integer b = 10;
integer b = 10;
for(; a < b; ++a)
for (a = 0; a < b; ++a)
{
     llOwnerSay( (string)a ); // single statement
     llOwnerSay((string)a);
</source>
    llOwnerSay((string)a);
 
}
Although the following is technically possible, it's not recommended because it's hard to read and maintain.
</pre>
 
<pre>//null statement
The initialization is left out because the variable <code>a</code> already has the value zero.
 
The loop body is left out because the increment statement includes a function call which does everything that's needed.
<source lang="lsl2">
integer a = 0;
integer a = 0;
integer b = 10;
integer b = 10;
for(; a < b; llOwnerSay((string)(a++)));
for ( ; a < b; llOwnerSay((string)(++a)) )
</pre>
    ; // empty statement (could be at the end of the previous line)
</source>
|helpers
|helpers
|also_header
|also_header
Line 37: Line 52:
|also_articles
|also_articles
|also_footer
|also_footer
|notes=A for loop is the same as a while loop as below.
|notes=
<pre>
A for-loop can also be written as a [[While]]-loop.
<source lang="lsl2">
initializer;
initializer;
while(condition);
while(condition)
{
{
     loop;
     loop;
     increment;
     increment;
}
}
</pre>
</source>
|mode
|mode
|deprecated
|deprecated
|cat1
|cat1=Flow Control/Loop
|cat2
|cat2=Conditional
|cat3
|cat3
|cat4
|cat4
}}
}}

Latest revision as of 18:31, 19 May 2023

for( initializer; condition; incrementloop

•  initializer Executed once just before checking condition.
•  condition If this executes as true then loop is executed.
•  increment Executed after loop, then condition is checked again.
•  loop Can be either a single statement, a block statement, or a null statement.


Only the condition is required. The initializer, increment, and loop body are optional and can be left empty.

Specification

Conditional Types
Type Condition
integer True if it is not zero.
float True if it is not zero.[1]
string True if its length is not zero.
key True only if it is a valid key and not NULL_KEY.
vector True if the vector is not ZERO_VECTOR.
rotation True if the rotation is not ZERO_ROTATION.
list True if the length is not zero. Note that correct behavior is only seen with Mono-compiled scripts; LSO-compiled scripts incorrectly resolve to false if the list is non-empty: BUG-230728

Examples

The following is the most common way a for-loop is written, with each part properly specified.

The loop will run or "iterate" 10 times, from 0 to 9. It will execute two statements each iteration.

integer a = 0;
integer b = 10;
for (a = 0; a < b; ++a)
{
    llOwnerSay( (string)a ); // first statement
    llOwnerSay( (string)b ); // second statement
}

The following is less common, where the curly braces are left out.

This can be used when only one statement needs to be executed during the loop.

integer a = 0;
integer b = 10;
for (a = 0; a < b; ++a)
    llOwnerSay( (string)a ); // single statement

Although the following is technically possible, it's not recommended because it's hard to read and maintain.

The initialization is left out because the variable a already has the value zero.

The loop body is left out because the increment statement includes a function call which does everything that's needed.

integer a = 0;
integer b = 10;
for ( ; a < b; llOwnerSay((string)(++a)) )
    ; // empty statement (could be at the end of the previous line)

Notes

A for-loop can also be written as a While-loop.

initializer;
while(condition)
{
    loop;
    increment;
}

Deep Notes

Search JIRA for related Issues

Footnotes

  1. ^ The OpenSim LSL compiler will not do this implicitly. You will need to use an explicit check.