Die hele lambda-uitdrukking beschrijft nu een functie die precies één
argument nodig heeft. We kunnen de functie op een lijst toepassen op precies
dezelfde manier als we b.v. de functie "+" op 2 en 3 konden toepassen:
met een complexe uitdrukking waar de nieuwe functie de functor is en een
lijst het argument:
> ( (lambda (ls) (...)) '(a b c d e f g h i) )
( (a b) (c d) (e f) (g h) i)
Om niet elke keer dat we de functie willen gebruiken die hele lambda-uitdrukking
te moeten schrijven, kunnen we de lambda-uitdrukking in een variabele bewaren,
d.w.z. de functie een naam geven. Indenteren helpt de overzichtelijkheid:
> (define groepjes-van-twee
(lambda (ls)
(...)) )
Nu kunnen we simpelweg typen:
> (groepjes-van-twee '(a b c d e f g h i) )
( (a b) (c d) (e f) (g h) i)
Een functie heeft evenveel argumenten nodig als de lijst achter het
keyword lambda elementen heeft:
> (define plak-met-spatie
(lambda (string1 string2)
(string-append string1 " " string2)))
> (plak-met-spatie "Hallo" "Bertjan!")
"Hallo Bertjan!"
> (plak-met-spatie "Hallo")
[VM ERROR encountered!] Invalid argument count ...
Meer predikaten vind je op de pagina's van Walter Daelemans.
If heeft meestal drie argumenten:
de test (die als eerste geëvalueerd wordt),
de then-uitdrukking (die geëvalueerd wordt als de test
niet #f teruggeeft) en
de else-uitdrukking (die geëvalueerd wordt als de test
#f teruggeeft).
Als de else-uitdrukking ontbreekt, gebeurt er niets als de test
#f teruggeeft:
> (if (equal? 'Hoi
(car ls))
"Doei!")
De conditionele expressies met de keywords cond en case worden op Walter Daelemans pagina's uitgelegd.
; dit is dus commentaar
; eliza: een heel simpel soort dialoogprogramma
(define eliza
(lambda (input)
; de gebruiker moet een zin in vorm van een lijst ingeven
(cond ((equal? '(dag)
input) "ja, doei!")
; complete zin: dag
((equal? 'ik (car input)) (if
(equal? 'denk (cadr input))
; patroon: ik denk ...
(append '(waarom denk je) (cddr input))
"je hebt het altijd over jezelf!"))
; patroon: ik ...
((member 'moeder input) "houd je van je familie?")
; trefwoord: moeder
((or (equal? '(ja) input)
; complete zin: ja
(equal? '(nee) input)) "hoezo?")
; complete zin: nee
(else
(append input '(?))))))
PS: Ik heb nog niet kunnen ontdekken hoe je hier goed uit komt (anders dan het hele DOS-venster te sluiten).