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
Exempel B2
Visa den grafiska strukturen för följande listor:
(b (c) d) (((a) b) c) (a (b . c)) (a . (b . nil))
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)
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))
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))
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)
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)))
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)
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))
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
Sidansvarig: Peter Dalenius
Senast uppdaterad: 2004-11-08
