3.3. Lister, lister og atter lister

Du er nå ferdig med variablar og funksjonar, og er klar for det skumle området av Scheme som handlar om lister.

Før vi ser meir på dette med lister, er det viktig at du kjenner skilnaden på delverdiar (av og til i programmerarverda kalla “atomverdiar”) og lister.

Ein delverdi er ein enkeltverdi. Vi brukte delverdiar då vi definerte variablar og tileigna desse ein verdi tidlegare i kurset. Som eit eksempel kan vi tileigna variabelen “x” delverdien “8” i dette uttrykket:

(let* ( (x 8) ) x)

(Her er variabelen x lagt til på slutten av uttrykket bare for å få skrive ut verdien av x. Dette fordi <code>let*</code> arbeider akkurat som ein funksjon og returnerer verdien i det siste uttrykket.

Ein variabel kan også referere til ei liste med verdiar i staden for bare til ein enkelt verdi. For å tileigna verdilista 1, 3, 5 til variabelen x skriv vi:

(let* ( (x '(1 3 5))) x)

Prøv begge setningane i Script-Fu konsollen og legg merke til svaret du får. Når du skriv den første setning, blir svaret

8

Den andre setning vil gi svaret:

(1 3 5)

Svaret “8” fortel at x inneheld “atomverdien” “8”. Svaret (1 3 5) viser at x ikkje inneheld ein enkelt verdi, men ei liste med verdiar. Legg merke til at Scheme ikkje bruker komma mellom verdiane, verken i den lista du skriv inn eller i det svaret du får ut att.

For å definera ei liste, brukar du syntaksen:

'(a b c)

der a, b og c er verdiane. Apostrofen (') blir nytta for å fortelje at det som kjem etter inne i parentesen er ei liste med verkelege verdiar, ikkje funksjonar eller uttrykk.

Du kan også definere ei tom liste:

'()

eller bare

()

Ei liste kan innehalde direkteverdiar, eller nye lister:

(let*
   (
        (x
           '("GIMP" (1 2 3) ("is" ("great" () ) ) )
        )
    )
    x
)
      

Legg merke til at det er nok med den første apostrofen. Prøv programmet i konsollen og sjå kva som kjem ut av det.

Du bør også merka deg at det resultatet som blir returnert ikkje er ei liste med enkeltverdiar, men ei liste med samla verdiar. <code>("GIMP")</code>, lista <code>(1 2 3)</code> osv.