Göm menyn

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å?

Se svar

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

Se svar

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

Se svar

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

Se svar

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)

Se svar

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

Se svar


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