Del J: Makron
Exempel J1
Vad blir resultatet av följande uttryck med backquote, dvs vad returneras om de skrivs in vid Lisp-prompten?
`(list ,(- 2 3) 2 ,(first '(3 2))) `(cons (first ',(list 'a)) ,'(list 'b))
Om värdet av dessa uttryck i sin tur skulle beräknas (t.ex. genom
att skickas som argument till eval, vad skulle resultatet
bli då?
Exempel J2
Skriv ett makro setsumma som tar en variabel och en
lista med variabler. Den första variabeln ska sättas till summan av
variablerna i listan. Exempel:
CL-USER(8): (setq a 3) 3 CL-USER(9): (setq b 4) 4 CL-USER(10): (setq c 5) 5 CL-USER(11): (setsumma total (a b c)) 12
Exempel J3
Skriv ett makro set10 som tar en variabel som innehåller
ett heltal. Makrot ska ge variabeln ett nytt värde som är avrundat
uppåt till närmaste högre tiotal. Exempel:
CL-USER(17): (setq a 47) 47 CL-USER(18): (set10 a) 50
Exempel J4
Vi vill implementera stackar som vanliga listor. En stack är en
datastruktur där man lägger till och tar bort element enbart i toppen.
Man brukar jämföra en stack med en trave tallrikar. För en stack finns
två operationer push-stack och pop-stack.
Funktionen push-stack placerar ett element överst i stacken
och returnerar detta elementet. Funktionen pop-stack tar bort
elementet som finns överst i stacken och returnerar detta. Exempel:
CL-USER(21): (setq min-stack '()) NIL CL-USER(22): (push-stack min-stack 'a) A CL-USER(23): (push-stack min-stack (+ 1 2)) 3 CL-USER(24): (pop min-stack) 3 CL-USER(25): (pop min-stack) A
Exempel J5
Vi önskar en konstruktion lägg-till med vars hjälp
man kan lägga till ett eller flera element till en global lista
enligt följande exempel:
CL-USER(28): (setq *namn* '(adam bertil)) (ADAM BERTIL) CL-USER(29): (lägg-till *namn* lisa) (LISA ADAM BERTIL) CL-USER(30): (lägg-till *namn* eva stina pelle) (EVA STINA PELLE LISA ADAM BERTIL)
Exempel J6
Skriv ett makro öka som ökar ett godtyckligt antal
variabler med ett. Makrofunktionen ska returnera en lista med
respektive nytt värde. Exempel:
CL-USER(40): (setq nr 10) 10 CL-USER(41): (setq max 47) 47 CL-USER(42): (öka nr max) (11 48) CL-USER(43): nr 11
Sidansvarig: Peter Dalenius
Senast uppdaterad: 2004-11-08
