Lisp 3


Hieronder volgt een lijstje van de op het tweede en derde college behandelde functie's in Lisp
length
Heeft argument een lijst, en levert de lengte van de lijst op: (length '(a b c)) -> 3
reverse
Heeft een lijst als argument, die in omgekeerde volgorde wordt opgeleverd. (reverse '(a b c)) -> (c b a)
last
last levert een lijst met een element: het laatste element van de lijst die als argument werd meegegeven. (last '(a b c)) -> (c)
assoc
assoc zoekt uit een z.g. associatielijst naar een door een key geidentificeerd element. Voorbeeld: (assoc 'weight '((height 1.65) (weight 55))) -> (weight 55)
eq
eq test of twee elementen identiek zijn: (eq 'a 'a) -> T ; (eq '(a b) '(a b)) -> nil
null
Null test of een element gelijk is aan nil: (eq x nil) = (null x)

Functiedefinities in Lisp

In lisp worden functie's gedefinieerd met behulp van de defun functie. Het algemene schema voor defun is als volgt:
(defun [functienaam]
       ([parameters])
       [body])
Voorbeeld van een functiedefinitie: second, dat het tweede element van een lijst oplevert:
(defun second            ; functienaam
       (l)               ; parameter
       (first (rest l))) ; body

Conditieconstructies in Lisp

Voor een als...dan... constructie zijn een aantal mogelijkheden binnen Lisp. De meest algemene is de COND functie, met IF en WHEN als afgeleiden:
(cond ( [test-1] [body-1] )
      ( [test-2] [body-2] )
        ................
      ( [test-n] [body-n] ))
Bij de cond functie worden [test-1] t/m [test-n] een voor een geevalueerd, tot er een is die iets ongelijk nil oplevert. Zodra deze gevonden wordt de bijbehorende [body-i] geevalueerd en als resultaat opgeleverd. De resteren [test-i] worden niet meer geevalueerd.
(if [test] [then-part] [else-part])
   =
(cond ( [test] [then-part])
      ( T [else-part]))

(when [test] [then-part])
   =
(if [test] [then-part] nil)

Definitie van reverse

Conditieconstructies en functiedefinities kunnen gecombineerd worden tot recursieve functies, bijvoorbeeld in de definitie van reverse:
(defun reverse (l)
  (if (null l)
      nil
    (append (reverse (rest l))
	    (list (first l)))))

Definitie van assoc

Nog een voorbeeld van een recursieve functie, nu met cond:
(defun assoc (key a-list)
  (cond
   ((null a-list) nil)
   ((eq key (first (first a-list))) (first a-list))
   (t (assoc key (rest a-list)))))

De LET-constructie

Met behulp van LET kunnen tijdelijke variabele-bindingen gemaakt worden, een soort locale variabelen, dus.
(let ( ( [var-1] [initial-1] )
       ( [var-2] [initial-2] )
        ....................
       ( [var-n] [initial-n] ))
  [body]
)
De let-constructie levert de evaluatie van [body] op, met daarin de variabelen [var-1] t/m [var-n] gekoppeld aan [initial-1] t/m [initial-n]. Binnen de body kunnen variabelen een andere waarde krijgen, b.v. door een setf.

Inhoud Lisp