Slingor
Föregående | Kapitel 6. Programmering med GEL | Nästa

## Slingor

### While-slingor

Syntax:

    while <expression1> do <expression2>
    until <expression1> do <expression2>
    do <expression2> while <expression1>
    do <expression2> until <expression1>

Dessa är liknande som i andra språk. Eftersom det i GEL helt enkelt är ett uttryck som måste ha ett returvärde kommer dessa konstruktioner dock att helt enkelt returnera resultatet av den sista iterationen eller `NULL` om ingen iteration utfördes. I det booleska uttrycket översätts `=` till `==` precis som för `if`-satsen.

### For-slingor

Syntax:

    for <identifier> = <from> to <to> do <body>
    for <identifier> = <from> to <to> by <increment> do <body>

Slinga med identifierare inställd till alla värden från `<from>` till `<to>`, valfritt med ett annat inkrement än 1. Dessa är snabbare, trevligare och mer kompakta än de vanliga slingorna som ovan, men mindre flexibla. Identifieraren måste vara en identifierare och kan inte vara en dereferering. Värdet på identifieraren är identifierarens sista värde, eller `<from>` om kroppen aldrig evaluerades. Variabeln är garanterad att vara initierad efter en slinga, så du kan använda den säkert. Vidare måste `<from>`, `<to>` och `<increment>` vara icke-komplexa tal. `<to>` är inte garanterad att träffas, men kommer aldrig att passeras, till exempel skriver följande ut udda tal från 1 till 19:

    for i = 1 to 20 by 2 do print(i)

Då ett av värdena är ett flyttal görs den sista kontrollen till inom 2^-20 av stegstorleken. Det vill säga även om vi passerar med 2^-20 gånger ”by”-värdet ovan kommer vi fortfarande att exekvera den sista iterationen. På detta sätt gör

    for x = 0 to 1 by 0.1 do print(x)

vad som förväntas även om addition av 0.1 tio gånger blir något mer än 1.0 på grund av hur flyttal lagras i bas 2 (det finns inget 0.1, det faktiska lagrade talet är något större). Detta är inte perfekt, men hanterar de flesta fallen. Använd faktiska rationella tal om du vill undvika att hantera detta problem, till exempel:

    for x = 0 to 1 by 1/10 do print(x)

Denna kontroll görs bara från version 1.0.16 och framåt, så exekvering av din kod kan skilja sig åt i äldre versioner.

### Foreach-slingor

Syntax:

    for <identifier> in <matrix> do <body>

För varje element i matrisen, från rad till rad från vänster till höger exekverar vi kroppen med identifieraren inställd till aktuellt element. För att skriva ut siffrorna 1,2,3 och 4 i denna ordning kan du göra:

    for n in [1,2:3,4] do print(n)

Om du vill gå genom raderna och kolumnerna i en matris kan du använda funktionerna RowsOf och ColumnsOf som returnerar en vektor av raderna eller kolumnerna i matrisen. Så

    for n in RowsOf ([1,2:3,4]) do print(n)

kommer skriva ut [1,2] och sedan [3,4].

### Break och Continue

Du kan också använda kommandona `break` och `continue` i slingor. Fortsättningskommandot `continue` kommer att starta om den aktuella slingan i dess nästa iteration, medan kommandot `break` går ur den aktuella slingan.

    while(<expression1>) do (
      if(<expression2>) break
      else if(<expression3>) continue;
      <expression4>
    )

Föregående | Upp | Nästa
Kapitel 6. Programmering med GEL | Hem | Summor och produkter