Difference between revisions of "Do while"

From Second Life Wiki
Jump to navigation Jump to search
m
m (added LSL Tip)
Line 17: Line 17:
|spec
|spec
|caveats
|caveats
|examples=<lsl>//Counts from 1 to 5
|examples=
<lsl>
//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.
//      {
         while(olf<5);                 // On the first pass/loop olf = 1
        //  Increment before the while condition.
             llSay(0, (string) (++olf));
//     }
         while(olf < 5);// On the first pass/loop olf = 1
     }
     }
}</lsl><lsl>//Counts from 0 to 4
}
</lsl>
<lsl>
//Counts from 0 to 4
 
default
default
{
{
Line 33: Line 44:
     {
     {
         integer olf;
         integer olf;
         do
         do
             llSay(0, (string)olf);// olf is still equal to zero.
//      {
         while((++olf)<5);// Increment after/during the test.
        //  olf is still equal to zero.
 
             llSay(0, (string)olf);
//     }
         while(++olf < 5);// Increment after/during the test.
     }
     }
}</lsl><lsl>//Counts from 0 to 4 and coments as it loops (block statement demo)
}
</lsl>
<lsl>
//Counts from 0 to 4 and coments as it loops (block statement demo)
 
default
default
{
{
Line 43: Line 63:
     {
     {
         integer olf;
         integer olf;
         do
         do
         {
         {
            llSay(0, (string)olf);// Curly brackets are required since there is more than one looped command.
        // 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>
}
</lsl>
<lsl>
//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 (12 < num)
             num = 12;
 
         do
         do
         {  gNameList += [llGetSubString(llDetectedName(--num),0,23)];//sometimes avatar names are too long for dialog display
         {  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
             gKeyList +=  [llDetectedKey(num)];                         // we will dialog select avatar by name, but still need their key
                                              //even if their name has not been truncated above
                                                                        // 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
        while (0 < num);
 
         llDialog(llGetOwner(),"Choose an avatar.", gNameList, gDlgChan);// channel is pre-defined when llSensor is triggered
     }
     }
</lsl>
</lsl>
Line 68: Line 98:
|also_functions
|also_functions
|also_tests
|also_tests
|also_articles
|also_articles=
{{LSL Tip|Please read [[User:Kireji_Haiku/How_to_deal_with_lists_in_LSL|this intro of how to iterate over a list in LSL]].}}
|also_footer
|also_footer
|notes
|notes

Revision as of 11:18, 6 November 2012

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

<lsl> //Counts from 1 to 5

default {

   state_entry()
   {
       integer olf;//  Without applied value an integer will be defaulted to zero.
       do

// {

       //  Increment before the while condition.
           llSay(0, (string) (++olf));

// }

       while(olf < 5);// On the first pass/loop olf = 1
   }

} </lsl> <lsl> //Counts from 0 to 4

default {

   state_entry()
   {
       integer olf;
       do

// {

       //  olf is still equal to zero.
           llSay(0, (string)olf);

// }

       while(++olf < 5);// Increment after/during the test.
   }

} </lsl> <lsl> //Counts from 0 to 4 and coments as it loops (block statement demo)

default {

   state_entry()
   {
       integer olf;
       do
       {
       //  Curly brackets are required since there is more than one looped command.
           llSay(0, (string)olf);
           llSay(0, "looping");
       }
       while (++olf < 5);
   }

} </lsl> <lsl> //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 (12 < num)
           num = 12;
       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
                                                                       //  even if their name has not been truncated above
       }
       while (0 < num);
       llDialog(llGetOwner(),"Choose an avatar.", gNameList, gDlgChan);//  channel is pre-defined when llSensor is triggered
   }

</lsl>

See Also

Articles

KBcaution.png Important: Please read this intro of how to iterate over a list in LSL.

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.