För att fullständigt beskriva en ADT krävs enligt Cleaveland kännedom om
Implementationen behöver vi inte intressera oss för om vi bara vill använda atomer och listor.
list ::= (listinnehåll) | () listinnehåll::=element | element listinnehåll element ::= lista | atom
Således kan en lista antingen vara tom eller innehålla element. Dessa element kan vara antingen atomer eller listor. En atom kan ses som Lisps minsta odelbara enhet till vilken t ex värden eller funktionsdefinitioner kan bindas.
Exempel
(A B C) () (A B (C D) ())
Exempel
2 betyder två, osv.
Andra värderingsregler:
Man kan, av teoretiska skäl, på NIL och T å ena sidan, och sant och falskt å andra.
first[l] | en funktion som tar ett argument, en lista. Funktionen returnerar det första elementet i listan. |
rest[l] | en funktion som tar ett argument, en lista.Funktionen returnerar hela listan förutom det första elementet. |
concat[x;l] | en funktion som tar två argument, ett listelement (dvs en atom eller en lista) och en lista.Funktionen returnerar en lista där x är insatt först i l. |
atom[x] | en funktion som tar ett argument från valfri domän (dvs av valfri typ). Funktionen avgör om x är en atom eller inte. Funktionen returnerar sant eller falskt. |
endp[l] | en funktion som tar ett arguement, en lista. Funktionen returnerar sant om l är den tomma listan, falskt annars. |
numberp[a] | en funktion som tar ett argument, en atom. Funktionen returnerar sant om a är en numerisk atom, falskt annars. |
concat[A;(B C)] (A B C) first[concat[(B D);(C E)]] (B D) atom[(A B)] NILNotera att Lisp-funktionerna inte påverkar sina argument. De motsvarar således, mycket fritt hållet, funktioner med värdeöverförda parametrar.
De primitiver som returnerar "större" sammansatta objekt kallas konstruktorer, de primitiver som returnerar delar av objekt kallas selektorer och de som returnerar sanningsvärden kallas predikat.
eq[x;y] | en funktion som tar två argument, båda atomer. Funktionen returnerar sant om dessa var lika, annars falskt. |
Dessa behövs egentligen inte för att utföra beräkningar men gör många problem mycket lätthanterligare. (Egentligen kan även endp uteslutas, endp[x] är identiskt med eq[x;NIL]).
(EQ 1 1) ==> T (ATOM 1) ==> T (CONCAT 1 (CONCAT 2 ())) ==> (1 2) (ATOM (CONCAT 1 ()) ==> NIL (ATOM T) ==> T (+ 1 5) ==> 6Vi låter ==> betyda "returnerar".
Således utvärderas parametrarna till en funktion innan de överförs. Detta kallas värdeöverföring, eng. Call-By-Value (CBV).
Exempel
(FIRST (QUOTE (A B))) ==> A. (QUOTE (+ 1 5)) ==> (+ 1 5) (+ 1 5) ==> 6 (CONCAT (QUOTE A) (QUOTE (B))) ==> (A B)
(QUOTE X) kan förkortas till 'X
.
Exempel
(CONCAT 'X '(A B)) ==> (X A B) (EQ 'A 'B) ==> NIL (CONCAT (FIRST '(FUNKTIONELL DAT)) '(PROGRAMMERING)) ==> (FUNKTIONELL PROGRAMMERING)
(COND (villkor1 värde1) (villkor2 värde2) (villkor3 värde4) . . . . . . . (villkorn värden))
Cond- konstruktionen utvärderas enligt följande:
Exempel
(COND ((EQ 1 2) 5) (T 6)) ==> 6 (COND ((ATOM (FIRST '(A B))) 'C) (T NIL)) ==> CArgumenten till COND-konstruktionen utvärderas alltså inte enligt CBV.
(DEFUN namn (parametrar) funktionskropp)När defun evalueras "skapas" en funktion.
Exempel
(DEFUN ALLRA-FOERST (X) (FIRST (FIRST X)))Ett "anrop" till allra-forst kan t ex bli
(ALLRA-FOERST '((A B) C)) ==> AExempel
(DEFUN FAC (N) (COND ((EQ N 0) 1) (T (* N (FAC (- N 1)))))) (FAC 3) ==> 6
Läs i gärna Allen. Allen beskriver i kap 1.2 S-uttryck, i kap 1.3 olika representationer av S-uttryck. Dessa avsnitt bör läsas noggrannt.
equal[x;y] | predikat (dvs funktion som returnerar sanningsvärde), som tar två argument, från valfri domän (dvs av valfri typ). Funktionen returnerar T om dessa är lika, NIL annars. |
numberp[a] | predikat, som tar ett argument, en atom. Funktionen returnerar T om a är en numerisk atom, NIL annars. |
member[e;l] | funktion som tar två argument, det första av valfri typ, det andra en lista. Om e finns i l returneras listan l med början vid det funna värdet, NIL annars. Notera att member inte är det predikat som avgör om elementet e ingår i listan l. Predikatet bör heta member-p. Skriv det själv! |
+,-,*,/ | Aritmetik. Fungerar precis som man tror. |
and, or, not | Logiska konnektiv (ungefär: logiska funktioner). Fungerar precis som man tror. |
append[l1;l2] | funktion av två argument, båda listor. Funktionen returnerar en lista vars "början" utgörs av elementen i l1 och vars fortsättning utgörs av elementen i l2. |
second[x], third[x], fourth[x] etc. | Selektorer, dvs funktioner som returnerar delar av sina argument. Fungerar precis som man tror. |
last[l] | funktion av ett argument, en lista. Funktionen returnerar en lista, som innehåller det sista elementet i l. |
list[x1;x2; ....;xn] | funktion av flera argument, där argumenten kan vara antingen listor eller atomer. Funktionen returnerar en ny lista som innehåller x1...xn som element. |
Anders Berglund office + 46 (18) 471 31 67 Information Technology mobile + 46 (70) 425 02 11 Department of Computer Systems fax, dept + 46 (18) 55 02 25 P.O. Box 325 S-751 05 Uppsala Sweden e-mail: Anders.Berglund@docs.uu.se