Difference between revisions of "Do while"

From Second Life Wiki
Jump to navigation Jump to search
(Removed div styling to reduce width of entry and to maintain continuity and added a few notes to old examples.)
m (Replaced old <LSL> block with <source lang="lsl2">)
 
(6 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{#vardefine:p_loop_desc|Executes once, then executes '''condition'''.
{{#if:
}}{{#vardefine:p_condition_desc|If condition executes true, it then loops back and executes '''loop''' again.
 
{{#vardefine:p_loop_hover|Executes once, then executes condition.}}
{{#vardefine:p_condition_hover|If condition executes true, it then loops back and executes loop again.}}
 
{{#vardefine:p_loop_desc|Executes once, then executes {{LSLP|condition}}.}}
{{#vardefine:p_condition_desc|If condition executes true, it then loops back and executes {{LSLP|loop}} again.}}
 
}}{{LSL_Conditional
}}{{LSL_Conditional
|statement=do while
|statement=do while
|statement_header
|statement_header
|statement_desc=Any of the statements can be null statements. A do...while loop is slightly faster than a while or for loop, and requires fewer bytes of memory than a while or for loop.
|statement_desc=Any of the statements can be null statements. A do...while loop is slightly faster than a while or for loop, and requires fewer bytes of memory than a while or for loop. (However, the speed increase and byte difference does not apply to scripts compiled in Mono)
|statement_title=do {{LSL Param|loop}} while ({{LSL Param|condition}});
|statement_title=do {{LSL Param|loop}} while ({{LSL Param|condition}});
|p1_name=loop
|p1_name=loop
Line 11: Line 17:
|spec
|spec
|caveats
|caveats
|examples=<lsl>//Counts from 1 to 5
|examples=<source lang="lsl2">//Counts from 1 to 5
default
default
{
{
     state_entry()
     state_entry()
     {
     {
         integer olf;// Without applied value an integer will be defaulted to zero.
         integer olf;   // Without applied value an integer will be defaulted to zero.
         do
         do
             llSay(0, (string) (++olf));// Increment before the while condition.
             llSay(0, (string) (++olf));       // Increment before the while condition  
         while(olf<5);                 // On the first pass/loop olf = 1
         while (olf < 5);                   // On the first pass/loop olf = 1
     }
     }
}</lsl><lsl>//Counts from 0 to 4
}</source><source lang="lsl2">//Counts from 0 to 4
default
default
{
{
Line 28: Line 34:
         integer olf;
         integer olf;
         do
         do
             llSay(0, (string)olf);// olf is still equal to zero.
             llSay(0, (string)olf);   // olf is still equal to zero at first iteration
         while((++olf)<5);// Increment after/during the test.
         while (++olf < 5);           // Increments then does the while-test
     }
     }
}</lsl><lsl>//Counts from 0 to 4 and coments as it loops (block statement demo)
}</source><source lang="lsl2">//Counts from 0 to 4 and comments as it loops (block statement demo)
default
default
{
{
Line 38: Line 44:
         integer olf;
         integer olf;
         do
         do
         {
         {   // Curly brackets are required since there is more than one statement within the do-loop
             llSay(0, (string)olf);// Curly brackets are required since there is more than one looped command.
             llSay(0, (string)olf);  
             llSay(0, "looping");
             llSay(0, "looping");
         }
         }
         while((++olf)<5);
         while (++olf < 5);
     }
     }
}</lsl><lsl>
}</source><source lang="lsl2">
//Practical example of where a do/while loop is more immediately useful than a while loop:
//Practical example of where a do/while loop is more immediately useful than a while loop:
//Note that a sensor event always contains input data, so the 'do' always has something to process
//Note that a sensor event always contains input data, so the 'do' always has something to process
     sensor(integer num)
     sensor(integer num)
     {  if(num>12)
     {   
             num=12;
        if (num > 12)
             num = 12;
         do
         do
         {  gNameList += [llGetSubString(llDetectedName(--num),0,23)];//sometimes avatar names are too long for dialog display
         {   
             gKeyList += [llDetectedKey(num)];//we will dialog select avatar by name, but still need their key
            // --num decrements num before using it to pick up a detected avatar's name. Thus we retrieve #11 through #0
                                              //even if their name has not been truncated above
            gNameList += [llGetSubString(llDetectedName(--num), 0, 23)];   //sometimes avatar names are too long for dialog display
         }while(num>0);
             gKeyList += [llDetectedKey(num)];   //we will dialog select avatar by name, but still need their key
         llDialog(llGetOwner(),"Choose an avatar.",gNameList,gDlgChan);//channel is pre-defined when llSensor is triggered
                                                  //even if their name has not been truncated above
         } while (num > 0);
         llDialog(llGetOwner(), "Choose an avatar.", gNameList, gDlgChan); //channel is pre-defined when llSensor is triggered
     }
     }
</lsl>
</source>
|helpers
|helpers
|also_header
|also_header

Latest revision as of 01:12, 22 January 2015

do loop while (condition);

•  loop Executes once, then executes condition.
•  condition If condition executes true, it then loops back and executes loop again.


Any of the statements can be null statements. A do...while loop is slightly faster than a while or for loop, and requires fewer bytes of memory than a while or for loop. (However, the speed increase and byte difference does not apply to scripts compiled in Mono)

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

//Counts from 1 to 5
default
{
    state_entry()
    {
        integer olf;   // Without applied value an integer will be defaulted to zero.
        do
            llSay(0, (string) (++olf));       // Increment before the while condition 
        while (olf < 5);                    // On the first pass/loop olf = 1
    }
}
//Counts from 0 to 4
default
{
    state_entry()
    {
        integer olf;
        do
            llSay(0, (string)olf);    // olf is still equal to zero at first iteration
        while (++olf < 5);            // Increments then does the while-test
    }
}
//Counts from 0 to 4 and comments as it loops (block statement demo)
default
{
    state_entry()
    {
        integer olf;
        do
        {   // Curly brackets are required since there is more than one statement within the do-loop
            llSay(0, (string)olf);    
            llSay(0, "looping");
        }
        while (++olf < 5);
    }
}
//Practical example of where a do/while loop is more immediately useful than a while loop:
//Note that a sensor event always contains input data, so the 'do' always has something to process
    sensor(integer num)
    {   
        if (num > 12)
            num = 12;
        do
        {   
            // --num decrements num before using it to pick up a detected avatar's name. Thus we retrieve #11 through #0
            gNameList += [llGetSubString(llDetectedName(--num), 0, 23)];    //sometimes avatar names are too long for dialog display
            gKeyList  += [llDetectedKey(num)];    //we will dialog select avatar by name, but still need their key
                                                  //even if their name has not been truncated above
        }  while (num > 0);
        llDialog(llGetOwner(), "Choose an avatar.", gNameList, gDlgChan);  //channel is pre-defined when llSensor is triggered
    }

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.