21-1-2 1 Dagens föreläsning Hur fungerar ett Lisp system intern struktur av symbolen, tal, listan pekare - delade strukturer - eq minneshantering fri lista - sophämtning/garbage collection stack Diverse Common Lisp Konstanter, parametrar, globala variabler (avs 14.2) Parameterlistor (avs 14.4) Flervärda funktioner (avs 14.5)
21-1-2 2 Intern struktur Lispsystem runtimesystem kompilerad kod stack interpretator eval/apply grundläggande primitiver i/o filhantering program bindningar parametrar /lokala variabler och värden listor program och data symboler tal arraystrukturer...
21-1-2 3 CL-USER(1): (room t)... code type items bytes 126: (SIMPLE-ARRAY (UNSIGNED-BYTE 16)) 1767 21534 112: (SIMPLE-ARRAY T) 27822 1755224 1: CONS 8723 68344 7: SYMBOL 1423 621536 8: FUNCTION 265 574776 12: (SIMPLE-ARRAY FIXNUM) 258 266264 117: (SIMPLE-ARRAY CHARACTER) 2783 158184 : CLOSURE 557 314 125: (SIMPLE-ARRAY (UNSIGNED-BYTE 8)) 15 8234 18: (SHORT-SIMPLE-ARRAY CODE) 228 686 12: STANDARD-INSTANCE 3737 572 15: STRUCTURE 4 3684 127: (SIMPLE-ARRAY (UNSIGNED-BYTE 32)) 11 1286 135: SYMBOL-LOCATIVE 32 1528 1: HASH-TABLE 12 576 18: BIGNUM 418 548 17: DOUBLE-FLOAT 127 232 111: (SHORT-SIMPLE-ARRAY FOREIGN) 6 14 16: SINGLE-FLOAT 186 1488 13: MV-VECTOR 13 1144 1: RATIO 32 512 118: (SIMPLE-ARRAY BIT) 12 32 2: COMPLEX 11 176 8: (ARRAY T) 7 168 11: READTABLE 1 16 123: (SIMPLE-ARRAY (SIGNED-BYTE 32)) 1 88 6: (SHORT-SIMPLE-ARRAY T) 4 64 13: SYSVECTOR 4 64 85: (ARRAY CHARACTER) 1 24 75: SHORT-ARRAY 1 24 total bytes = 661264...
21-1-2 4 Pekare Adress till minnesutrymme Ett minnesutrymme innehåller antingen själva dataobjektets värde, t ex ett tal eller en pekare till ett annat minnesutrymme. typ pekare Typ anger datatypen (i Lisp s mening) på det objekt pekaren anger. Vi har tidigare i samband med cons-celler ritat en pil för att ange en pekare. en cons-cell symbolen kalle
21-1-2 5 olen a får globala värdet kalle Symbol En symbol är unik (relativt ett paket) En symbol kan ses som en post som innehåller bl a symbolen kalle kalle 1 (lambda (x)..) pname globalt funktions- egenskapsprintname värde definition lista Symbolposterna lagras i en tabell (area) och stränagarna i en strängarea symboltabell strängarea 11 12 a 13 14 15 car 16 17 18 1 11 111 kalle append
21-1-2 6 Tal små tal pekare 35 dataobjekt stora tal 123...78 123......78 lämplig uppdelning av talet flyttal exp mantissa bråk 3/5 heltalet 3 heltalet 5
21-1-2 7 I minnet finns data heltal representeras i det binära talsystemet 1 1 1 1 1 128=2 7 64 32 16 8 4 2=2 1 1 =2 128+32+16+4+1 = 181 1 = 11111 2 = B5 16 Det hexadecimala talsystemet har 16 som bas med siffrorna till och A tom F. Negativa tal kan representeras på olika sätt. Första biten skulle kunna ange tecknet. Ofta använder man komplementmetoder. Flyttal representeras med exponent och mantissa tal = m * 2 k 317 = 317/512 * 2 =.111111 2 * 2 11 2 1 1 1 1 1 1 1 1... Mer om representation av tal i härvara tas upp i Digitalteknikkursen. Se även Brookshear avsnitt 1.5-1.7
21-1-2 8 Funktionen eq jämför pekare. Symboler är unika (eq kalle kalle) => t Små heltal är unika (eq 1 1) => t Stora heltal, flyttal, bråk är ej unika (eq 1 1) => nil (eq 1.5 1.5) => nil (eq 5E6 5E6) => nil (eq 3/5 3/5) => nil Pekare till olika listor (eq (a b) (a b)) => nil Pekare till identiskt samma conscell (setq p (a b)) (setq q (rest p)) p p => (a b) a q => (b) q b (eq (rest p) q) => t (eq (rest p) (b)) => nil b
21-1-2 Listan - cons-celler 1 minneshantering via fri lista adress car cdr 1 2 3 4 5 6 7 8 1 11 12 13 14 15 2 3 4 5 6 7 8 1 11 12 13 14 15 16 cons-cell 16 17 17 slutmarkering
21-1-2 1 Exempel (setq a (list (quote (a)) (quote b))) Läs in detta Lisp-uttryck. Det inmatade uttrycket är en lista som skall läggas in i listtabellen. Utrycket skall sedan beräknas, som resulterar i att symbolen a får det globala värdet ((a) b). Det inlästa uttrycket kan illustreras med den grafiska representationen såsom: setq a list quote quote b a
21-1-2 11 1 adress 1 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17 11 12 13 14 15 16 17 18 1 11 111 Symbolerna som ingår i det inlästa uttrycket finns i symboltabellen list setq b a quote nil
21-1-2 12 setq a list quote a quote b
21-1-2 13 Allokering av cons-cell (cons a (b c)) pekaren till a pekaren till listan (dess första cons-cell) 1) ta första elementet från fria listan 2) låt fria listan ange nästföljande element 3) lägg in pekarna till cons s argument 4) returnera adressen till den nyss allokerade cons-cellen
21-1-2 14 Listan Efter inläsningen av uttrycket adress 1 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17
21-1-2 15 Efter det att uttrycket beräknats (setq a (list (quote (a)) (quote b)) setq a list quote quote b a? b
21-1-2 16 14 adress 1 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17 13 16 4 11 7 1 17 16 17 14 2 3 1 5 6 1 8 1 1 11 1 15 16 17 11 12 13 14 15 16 17 18 1 11 111 Efter beräkning av uttrycket. Symbolen a skall få ett nytt värde list setq b a quote nil
21-1-2 17 Avallokering av minnesutrymme sker automatiskt med sk garbage collection (sophämtning) Finns flera olika metoder: mark-and-sweep - varje objekt har en extra märkbit - det är vid varje tillstånd givet alla ställen från vilket liststrukturer kan refereras från 1) om fria listan är tom vid en cons påbörjas en garbage collection 2) följ alla liststrukturer och sätt märkbiten 3) gå sekvensiellt igenom och bilda en ny fri lista av elle ej märkta cons-celler. Slå av märkbiten.
21-1-2 18 Listan märksteget adress 1 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17 märkbit 13 16 4 11 7 1 17 16 17 14 14 2 3 1 5 6 1 8 1 1 11 1 13 1 15 16 17
21-1-2 1 Listan 1 adress 1 2 3 4 5 6 7 8 1 11 12 13 14 15 16 17 skapa ny fri lista 13 16 4 11 7 1 17 16 17 14 14 2 3 4 5 6 7 8 1 1 11 14 13 1 15 16 17 märkbit fritt utrymme 1 1 1
21-1-2 2 Referensräknare på varje objekt 3 Fördel: cons-celler kan samlas in efter hand och läggas till fria listan Nackdel: referensräknare tar mycket plats klarar ej cirkulära strukturer Enklare modell: - inga referenser 1 - en referens 1 - två referenser 11 - många referenser
21-1-2 21 Stack stack frame innehåller: - uttryck som håller på att beräknas - bindningar formella parametrar - värdet av argumenten - bindning av lokal variabel / funktion till sitt värde Innehållet i stacken kan inspekteras och till vissa delar ändras via :zoom eller :wdebug (window debugger)
21-1-2 22 Konstant (defconstant my-pi 3.1415) går ej att ändra Parameter (defparameter *max-indata* 5) (make-array *max-indata*...) (dotimes (i *max-indata*..)...) ges värde vanligen endast en gång Globala variabel (defvar *lisas-almanacka* (skapa-tom-årsalmanacka)) (setq *lisas-almanacka* (boka...)) ändras med tilldelning
21-1-2 23 Formella parameterlistor optional parametrar (defun f (x &optional y)) (list x y)) (f 1 2) => (1 2) (f 1) => (1 nil) (defun f (x &optional (y 1)) (list x y)) (f 1) => (1 1) godtyckligt antal parametrar (defun f (x &rest args) (list x (reverse args))) (f 1) => (1 nil) (f 1 2 3 4 5) => (1 (5 4 3 2))
21-1-2 24 Formella parameterlistor nyckelordsparametrar (defun f (x &key min max) (list x min max)) (f a :max 1 :min 1) => (a 1 1) (f b :min :max 1) => (b 1) De aktuella parametrarna kan komma i godtycklig ordning :namn tillhör datatypen keyword och har sig själv som värde Alla argumenten, även nyckelorden, beräkas. På platsen för ett nyckelord kan stå ett godtyckligt uttryck
21-1-2 25 Formella parameterlistor Många funktioner använder nyckelordsparametrar för att ange extra argument: Finns en given nyckel i en associationslista? (defun key? (key al) (member key al :test # (lambda (key pair) (eq key (car pair))))) (remove x (x a x b x c x) :start 1 :end 5) => (x a b c x)
21-1-2 26 Flervärda funktioner (multiple value functions) Vissa funktioner ger flera resultat (truncate 2.3) 2.3 Gör en lista av alla värden en funktion returnerar: (multiple-value-list (truncate 2.3)) => (2.3) Skapa ett flervärt resultat: (values 1 2 3) => 1 2 3
21-1-2 27 Flervärda funktioner Vanligen vill man i den anropande funktionen binda upp det returnerade värdena till lokala variabler: (defun f (x) (if (not (numberp x)) (values typfel ) (values ok (+ x 1)))) returnerar två värden: typfel ok x+1 (defun g (a) (multiple-value-bind (status resultat) (f a) (if (eq status ok) bearbeta resultat felmeddelande ))) Med detta undviker man skapa nya listor.