1.3 Named Loops Proposal

Overview

For maximum flexibility this proposal separates the loop declaration from the loop-exiting keywords, which may appear anywhere and in any number within the loop. The simple label declaration of the 1.2 is extended to form the basis of other structures.

Named Loops

A named loop is opened with IM IN [YR]<identifier> and closed with IM OUTTA [YR]<indentifier> Anything declared within a named loop is not accessible outside it. Named loops may be nested, but may not overlap.

IM IN YR HOUSE 
IM IN YR BED
IM OUTTA YR BED 
IM OUTTA YR HOUSE

is ok.

IM IN YR HOUSE 
IM IN YR BED
IM OUTTA YR HOUSE
IM OUTTA YR BED 

is not ok.

Identifiers

An identifier may be an already declared variable. or object. If the latter, any reference to the object within the scope need not be prefixed by the object name; the scope acts as a WITH block.

If the identifer is preceded by YR then it is declared using the same rules as I HAS A except that its scope is confined to the block. For example:

IM IN YR BED ITZ “COMFY”

or

IM IN YR BED ITZ LIEK MAHBED

are both o.k.

Execution

The statements in a named loop, apart from the initial declaration, are repeated indefinitely until explicitly exited. If a loop is declared outside a function declaration, none of statements are executed until the scope is closed.

IM IN YR BED ITZ "COMFY"
  VISIBLE BED
  BED R "HARD"
IM OUTTA YR BED

Will print “COMFY” on the first iteration and “HARD” repeatedly thereafter.

Exiting a Loop

GTFO exits the innermost named loop unconditionally. GTFO <identifer> exits the identified outer loop. This form is also needed to exit a loop from within a case statement.

Example:

IM IN YR HUNTIN
	GIMMEH ANIMAL
        ANIMAL, WTF?
	 OMG "Hedgehog"
		VISIBLE "Prickly!!", GTFO
	 OMG "Dog"
		VISIBLE "Halp!!!", GTFO HUNTIN
	 OMG "Maus"
		VISIBLE "NOM NOM NOM", GTFO
      OMGWTF
		VISIBLE "Wat iz Dat?"
      OIC
      VISIBLE "Still Huntin!!"
IM OUTA YR HUNTIN

Conditional Exits

WILE <condition> exits the innermost named scope if <condition> is FAIL. It is equivalent to NOT <condition>, O RLY?, YARLY, GTFO, OIC.

For example, if you have declared an object filezorz that responds to the methods:

filezorz!!moar  BTW return WIN if not EOF
filezorz!!gimmeh BTW return next line

IM IN YR zorz ITZ filezorz
 WILE zorz!!moar
  process zorz!!gimmeh
IM OUTTA zorz

TIL <constant expression> exits the innermost named loop if the current value of the loop variable is equal to <constant expression>. It is equivalent to WILE DIFFRINT <indentifier> AN <constant expression>.

This is most useful for counted loops:

IM IN YR INDEX ITZ 0 BTW counting up
   TIL SIZEOF ABUKKIT
   process ABUKKIT!!INDEX
   UPPIN INDEX
IM OUTTA YR INDEX

IM IN YR INDEX ITZ SIZEOF ABUKKIT  BTW counting down
   TIL 0 
   NERFIN INDEX
   process ABUKKIT!!INDEX
IM OUTTA YR INDEX

Rationale: WILE would be sufficient on its own but counted loops are common, and comparisons in LOLCODE are verbose. Testing for equality is easily understandable, works both counting up and down, and avoids the common beginner's iterating over a zero-based range once too many. It doesn't work for increments other than one, but they are much less common, and can be expressed using WILE.

proposals/1.3/loop.txt · Last modified: 2007/10/01 17:17 by jennyb
Recent changes RSS feed Creative Commons License Donate Driven by DokuWiki