Göm menyn

Del B: Lisps datatyper och symboliska uttryck

Exempel B1

Klassificera följande uttryck (om det överhuvudtaget är ett korrekt uttryck) som symbol, heltal, flyttal, bråk, lista, tecken eller sträng. Antag att du skriver in uttryck som vanligt vid Lisp-prompten.

  abc123
  ABC123
  Abc123
  1.23e+12
  (abc123)
  ((()))
  +-
  mitt_namn
  mitt-namn
  mitt\ namn
  |mitt namn|
  "mitt namn"
  17+3
  17/3
  123(
  \(\)
  12.+34
  #\#
  "ab("
  #\abc

Se svar

Exempel B2

Visa den grafiska strukturen för följande listor:

  (b (c) d)
  (((a) b) c)
  (a (b . c))
  (a . (b . nil))

Se svar

Exempel B3

I denna övning tränas elementära funktioner för hantering av listor. Vad blir resultatet av nedanstående uttryck, dvs vad kommer att returneras om de skrivs in vid Lisp-prompten? Tänk igenom alla uttrycken innan du tittar i svaret!

  (first '(1 2 3 4))
  (second '(1 2 3 4))
  (first (rest '(1 2 3 4)))
  (rest (rest '(1 2 3 4)))
  (endp (rest (rest '(a b))))

  (car '(head tail))
  (car (quote (head tail)))
  (cdr '(head tail))
  (car (cdr '((a b) c)))
  (setq listan '((a b) c))
  listan

  (car (cdr (car listan)))
  (third listan)
  (cdar listan)
  (cons 'a '(b c))
  (cons listan listan)

Se svar

Exempel B4

I denna övning tränas de grundläggande listkonstruktorerna cons, list och append. Vi utgår från att vi har en lista som vi har skapat genom uttrycket (setq namn '(kalle lisa)). Vad blir då resultatet av följande uttryck?

  (cons namn namn)
  (list namn namn)
  (append namn namn)

  (cons namn (cons namn namn))
  (append namn (list namn namn))
  (cons namn (list namn namn))
  (list (cons namn namn))

  (cons (cons namn '()) '())
  (list (list namn))
  (append namn '())
  (cons (car namn) (cdr namn))

Se svar

Exempel B5

I denna övning tränas några grundläggande funktioner för listor. Vad blir resultaten av följande uttryck?

  (length '(1 2))
  (last '(a b c))
  (member 'a '(b a c))
  (member 'x '(b a c))
  (copy-list '(x y z))

  (reverse '(a b 1 2))
  (reverse (reverse '(a b c)))
  (reverse (cdr (reverse '(a b c))))
  (subst 'a 'b '(x a b a))
  (subst '+ '* '(* 10 5))
  (remove 'a '(x a b))

  (intersection '(a b c) '(x b z c))
  (union '(a b c) '(x b z c))

Se svar

Exempel B6

Vi har en funktion f som är definierad som

  (defun f (x y)
     (cond ((null x) y)
           ((null y) 'x)
           (t (list x (quote y)))))

Vad blir då resultaten av följande tre uttryck?

  (f (+ 2 3) (* 3 4))
  (f 'adam '())
  (f '() 'bertil)

Se svar

Exempel B7

I denna övning tränas på punkterade par. Vilka av följande uttryck kan skrivas om till "vanliga" listuttryck? Vad blir i så fall motsvarande uttryck? Rita även upp den grafiska strukturen!

  (a . b)
  (a . nil)
  (a . (b . nil))
  (a . (b . (c)))
  (a . (b c . (d e)))

Se svar

Exempel B8

Skriv två funktioner först-till-sist och sist-till-först som flyttar det första elementet i en lista till slutet, respektive det sista till början. Exempel:

  CL-USER(56): (först-till-sist '(a b c d))
  (B C D A)
  CL-USER(57): (sist-till-först '(a b c d))
  (D A B C)

Se svar

Exempel B9

Är det egentligen skillnad på att skapa en liststruktur med quote eller med list som i följande två fall?

  (setq l1 '(a b))
  (setq l2 (list 'a 'b))

Vad blir resultaten av följande uttryck?

  (eq l1 l2)
  (equal l1 l2)

  (setq l3 (cons 'x (cdr l1)))
  (eq (cdr l1) (cdr l2))
  (eq (cdr l1) (cdr l3))

  (setq l4 (cons l1 l1))
  (eq (car l4) (cdr l4))

  (setq l5 (cons l1 l2))
  (eq (car l5) (cdr l5))

Se svar

Exempel B10

Skriv Lisp-uttryck som skapar nedanstående struktur (där alltså den andra cons-cellen i kedjan pekar på den tredje):

  +-+-+   +-+-+   +-+-+  
  | | |---| | |---| |/|  
  +-+-+   +-+-+  /+-+-+  
   |       |    /  |     
  +-+-+    +---/   X     
  | |/|                
  +-+-+                
   |                   
   Y                   

Se svar


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