Göm menyn

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.

Se svar

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.

Se svar

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)

Se svar

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)

Se svar

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)

Se svar

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)

Se svar

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

Se svar


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2004-11-08