Zie de pagina van Walter Daelemans.

college stof

te behandelen commando's

samenvatting collegestof

Als eerste behandelen we het commando "quote". Dit commando kun je gebruiken om (technisch) evaluatie te onderdrukken. Dit is handig omdat je dat nodig hebt om een lijst te kunnen definieren. VB.:
         [1](define lijst (a b c))
	 ERROR
	 [2] (define lijst (quote (a b c)))
	 [3] lijst
	 (a b c)
"quote" kun je afkorten tot ' , dus (quote (a b c)) == '(a b c)
         [4] (define lijst2 '(a b c))
	 [5] lijst2
	 (a b c)
Nog zo'n commando dat erg handig kan zijn, is "length" "length" kun je toepassen op lijsten. Het vergelijkbare commando voor strings heet "string-length". VB:
        [5a] (length lijst2)
	3
	[5b] (define string "dit is mijn string")
	[5c] (string-length string)
	18
In scheme (en andere LISPen) is de lijst het belangrijkste, meest gebruikte data-type. Lijsten in Scheme zijn gedefinieerd als een serie paren (Engels: dotted pair). Paren maak je met "cons". Dus:
         [6] (cons 'a 'b)
	 (a . b)
N.B. let op de punt (vandaar DOTTED pair) Een paar bestaat uiteraard ALTIJD uit 2 elementen. Een lijst in Scheme is nu een paar waarvan het tweede element ook weer een lijst is, of de legel lijst (i.e. ()). Dit is een zogenaamde recursieve definitie, en recursie zullen we volgende week uitgebreid behandelen. Scheme kent ook functies om elementen van lijsten en paren te bekijken: "car" en "cdr". Car geeft je het eerste element van een paar, cdr het tweede. Vb:
          [7] (define paar (cons 'a 'b))
	  [8] (car paar)
	  a
	  [9] (cdr paar)
	  b
	  [10](cdr (cdr paar))
	  ERROR

N.B. een paar heeft maar 2 elementen, en als het tweede element een literal is, is de cdr daarvan niet gedefinieerd.

          [11] (define lijst (cons 'a (cons 'b '())))
	  [12] lijst
	  (a b)
	  [13] (car lijst)
	  a
	  [14] (cdr lijst)
	  b
	  [15] (cdr (cdr lijst))
	  ()

Het laatste, onzichtbare, element van een lijst is de lege lijst!
         

Dat gezegd hebbende (dit stuk was pure lisp) zijn er ook handigere manieren om lijsten te maken en bewerken in Scheme. "list" is om lijsten te definieren, alsvolgt:
         [16] (define lijstx (list "A" "B"))
	 [17] lijstx
	 ("A" "B")
	 [18] (cdr (cdr lijstx))
	 ()
N.B. laatste onzichtbare element is de lege lijst, dus dit is een echte lijst met "append" kun je elementen achter de lijst plakken. Append verwacht 2 of meer argumenten, allemaal lijsten. Je gerbuikt "append" zo:
         [19] (append lijstx '("C"))
	 ("A" "B" "C")

N.B. wel oppassen, vergelijk met
         [21] (append "C" lijstx)
	 ERROR
"C" is geen lijst ....
         [22] (append '("C") lijstx)
	 ("C" "A" "B")
'("C") is WEL een lijst!
Rest nog het commando "list-ref". List-ref gebruik je om een willekurig element uit een lijst te halen, door een lijst en een index op te geven. List-ref begint te tellen bij 0, dus het eerste element uit de lijst heeft index 0, het tweede index 1, enz. N.B. in tegenstelling tot "cdr" retourneert list-ref niet de legel lijst, als je dat verwacht. Dus wel:
          [23] (list-ref lijstx 0)
	  "A"
	  [24 (list-ref lijstx 1)
	  "B"

MAAR NIET
          [25] (list-ref lijstx 2)
	  ERROR

Opdrachten

Gegeven is een lijst van de 9 deelnemers van deze cursus:
> (define ls '(... ... ... ... ... ... ... ... ... ))

In plaats van de lijst zelf te definiëren kan je hem ook uit een file laden met
> (load "S:/terug/dn_lijst.txt")

Schrijf een commando dat de deelnemers in groepjes (lijsten) van 2 (alternatief: 3) samenvat. Het resultaat ziet er dan zo uit:
((... ... ) (... ... ) (... ... ) (... ... ) ...)
((... ... ... ) (... ... ... ) (... ... ... ))

1

Je mag hierbij alleen de functies car, cdr, cons en de combinaties cadr, caddr etc. gebruiken.

2

Gebruik ook list.

3

Gebruik ook list-ref.

4

Schrijf weer een commando dat de deelnemers in groepjes van 2 samenvat, alleen is een groep nu een dotted pair en geen lijst, dus (Berta . Coenraad) i.p.v.  (Berta Coenraad).

Oplossingen