Les 4

We gaan onverdroten verder met onze all-inclusive programmeercursus. Deze keer gaan we wat dieper in op functies. Vorige keer had ik er al een functie definitie ‘ingesneaked’ en wel het stukje:

(fn(x) (> 9 (length x))

dit is een voorbeeld van een anonieme functie, hij heeft geen naam omdat hij zo simpel is kun je hem makkelijk inline definiëren en meegeven aan een andere functie.(LISP heeft dus ‘hogere-orde’ functies).

Dat had je dus ook moeten/kunnen doen met de opgave: een functie meegeven aan de sort functie zodat hij op lengte sorteert. Als je een functie een naam wilt geven doe je dat met define, bijvoorbeeld om te kijken of een element in een lijstje zit, of hij een vriend is.

(define (vriend? x lst)
 (if (= lst '()) 
 nil 
 (or (= x (first lst)) (vriend? x (rest lst))))) 

> (set 'vrienden '("ferry" "jack" "bas" "nina" "willem")) 
("ferry" "jack" "bas" "nina" "willem") 

> (vriend? "nina" vrienden) 
true 

> (vriend? "trump" vrienden) 
nil

Dus define, dan de naam van de functie en dan de parameters. Als de functie nil (false) returned zit het element er dus niet in.

Je kunt ook zien dat deze functie zichzelf aanroept (recursieve functie) dat we gebruikmaken van een if om een keuze te maken en dat we gebruikmaken van een ‘shortcutted’ or functie (hij stopt gelijk als het eerste element ‘waar’ (true) is. Als je dat allemaal snapt ben je al een heel eind! Bovendien zie je dat je een lijstje ook een naam kunt geven, met set.

Volgende keer gaan we kijken hoe we met de (hopelijk gesorteerde ) woordenlijst alle mogelijke woorden kunnen genereren met 7 scrabble letters die we uit de pot getrokken hebben. Leuke opgave voor de volgende keer, probeer een functie te maken die iemand ontvriend. Dus ik wil bijvoorbeeld bas ontvrienden: (ontvriend “bas” vrienden) ((“ferry” “jack” “nina” willem”) moet dan het resultaat zijn.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *