Del H: Poster, arrayer och egenskapslistor
Exempel H1
Skapa en posttyp som innehåller information om en person. Strukturen ska innehålla personens namn och födelseår. Definiera sedan en funktion som tar en sådan post samt innevarande år och returnerar personens ålder.
Exempel H2
Definiera en posttyp nod som kan användas för att bygga
upp binära träd. En sådan nod ska ha två fält: ett för vänster och
ett för höger delträd. Varje delträd är i sig en nod, eller ett löv i
form av ett tal. Skriv därefter en funktion som går igenom ett sådant
träd och räknar ut summan av alla löv.
Exempel H3
Vad returneras av följande uttryck?
(setq numbers (make-array 4 :initial-element 0)) (aref numbers 3) (setq one-to-six (make-array 6 :initial-contents '(1 2 3 4 5 6))) (aref one-to-six 4) (setq matrix (make-array '(2 3) :initial-contents '((1 2 3) (4 5 6)))) (aref matrix 1 2)
Exempel H4
Vad returneras av följande uttryck? Rita också upp vilka strukturer som skapas samt hur de förändras!
(setq tab (make-array 4)) (setf (aref tab 0) 'a) (setf (aref tab 2) '(a b c)) (setf (aref tab 1) (make-array 2)) (setf (aref (aref tab 1) 0) '(x y)) (setf (aref tab 3) tab)
Exempel H5
Vad blir resultatet av följande uttryck?
(setf namn (vector 'kalle 'lisa 'pelle 'stina)) (length namn) (elt namn 3) (subseq namn 2 3) (reverse namn)
Exempel H6
Antag att vi har följande information om en person:
Namn: Staffan Fader: Martin Moder: Ebba Födelseår: 1981 Kön: Man Program: Kogvet
Vi vill lagra denna information i egenskapslistan för symbolen
staffan. Vad blir resultatet av följande uttryck?
(setf (get 'staffan 'fader) 'martin) (setf (get 'staffan 'moder) 'ebba) (get 'staffan 'fader) (setf (get 'staffan 'födelseår) 1981) (setf (get 'staffan 'program) 'kogvet) (symbol-plist 'staffan)
Vi lägger till ytterligare information om Staffan. Vad blir resultatet av följande uttryck?
(setf (get 'staffan 'bror) 'claes) (setf (get 'staffan 'syster) 'lisbeth) (symbol-plist 'staffan) (setf (get 'staffan 'kompisar) (cons 'katarina (get 'staffan 'kompisar))) (setf (get 'staffan 'kompisar) (cons 'liselott (get 'staffan 'kompisar))) (get 'staffan 'kompisar) (symbol-plist 'staffan) (get 'staffan 'program) (setf (get 'staffan 'kön) 'man) (eq (get 'staffan 'kön) 'man)
Exempel H7
Vi har ett antal geometriska objekt (trianglar, kvadrater, cirklar, m.m.) för vilka vi vill kunna beräkna ytan. Varje objekt är typmärkt och representerat som en lista på följande form:
(objektnamn typ-av-figur (mätdata ...))
Exemepel:
(blå-triangel triangel (10 20)) (min-tallrik cirkel (20))
Det tredje elementet innehåller en lista med mätdata. För triangeln är det basen och höjden, för cirkeln är det radien, osv. Varje geometrisk figur har i sin egenskapslista en funktion som beräknar ytan. För triangeln och cirkeln kan det se ut så här:
(setf (get 'triangel 'function)
#'(lambda (l) (/ (* (first l) (second l)) 2)))
(setf (get 'cirkel 'function)
#'(lambda (l) (* pi (first l) (first l))))
Skriv nu en funktion area som tar ett godtyckligt
geometriskt objekt och returnerar dess area! Körexempel:
CL-USER(158): (area '(blå-triangel triangel (10 20))) 100 CL-USER(159): (area '(min-tallrik cirkel (20))) 1256.6370614359173d0
Sidansvarig: Peter Dalenius
Senast uppdaterad: 2004-11-08
