INF2810: Funksjonell Programmering. En metasirkulær evaluator

Like dokumenter
INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Eksamensforberedelser

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Høyere-ordens prosedyrer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Eksamen i SLI230, vår 2003.

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

Innlevering 2a i INF2810, vår 2017

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Mengder og lokal tilstand

INF2810: Funksjonell Programmering. Introduksjon

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

Innlevering 2b i INF2810, vår 2017

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

LISP PVV-kurs 25. oktober 2012

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Introduksjon

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Strømmer

Lisp 3: Spesielle former, variabler, imperativ programmering

Lisp 5: Makroer. Programvareverkstedet. 29. april 2010

INF2810: Funksjonell Programmering. Introduksjon

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Introduksjon

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

UNIVERSITETET I OSLO

Hjemmeeksamen 2 i INF3110/4110

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffmankoding

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF2810: Funksjonell Programmering. Huffman-koding

Kap.4 Funksjoner. Tre viktig ting ifm. funksjoner: parameter (input) oppskrift (body) for å beregne resultat (output)

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b.

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Memoisering. I de følgende memoiseringeksemplene brukes tabeller, og vi tar derfor først en repetisjon av dette.

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3))

UNIVERSITETET I OSLO

LISP PVV-kurs 11. mars 2010

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

Anatomien til en kompilator - I

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Transkript:

INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013

Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer

Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer I dag Kap. 4 Metacircular evaluator En interpreter / evaluator for Scheme skrevet i Scheme.

En parentes: 3 Mye av denne forelesningen vil være basert på at vi sammen går igjennom kode i evaluator.scm med kjøringseksempler. http://www.uio.no/studier/emner/matnat/ifi/inf2810/v13/ undervisningsmateriale/evaluator.scm

Abstraksjon og språk 4 Vi har jobbet mye med abstraksjon i INF2810. Vi har definert abstraksjonsbarrierer. F.eks prosedyrer for å jobbe med mengder, bygget på prosedyrer for å jobbe med binærtrær. Kan sees som dedikerte mini-språk i språket. Som programmerere er det viktig å tenke at vi ikke bare bruker språk men skaper dem, lag på lag.

Abstraksjon og språk 4 Vi har jobbet mye med abstraksjon i INF2810. Vi har definert abstraksjonsbarrierer. F.eks prosedyrer for å jobbe med mengder, bygget på prosedyrer for å jobbe med binærtrær. Kan sees som dedikerte mini-språk i språket. Som programmerere er det viktig å tenke at vi ikke bare bruker språk men skaper dem, lag på lag. Denne strategien med å løse et komplekst problem ved å lage oss et nytt språk tilpasset problemet kalles (litt høytidelig) for metalingvistisk abstraksjon.

Abstraksjon og språk 4 Vi har jobbet mye med abstraksjon i INF2810. Vi har definert abstraksjonsbarrierer. F.eks prosedyrer for å jobbe med mengder, bygget på prosedyrer for å jobbe med binærtrær. Kan sees som dedikerte mini-språk i språket. Som programmerere er det viktig å tenke at vi ikke bare bruker språk men skaper dem, lag på lag. Denne strategien med å løse et komplekst problem ved å lage oss et nytt språk tilpasset problemet kalles (litt høytidelig) for metalingvistisk abstraksjon. Slik er det også med programmeringspråk; høynivåspråk bygger på lavnivåspråk som bygger på maskinspråk.

Evaluering av språk 5 Så langt: programmer for å utføre en gitt funksjon. Nå: programmer for å utføre programmer.

Evaluering av språk 5 Så langt: programmer for å utføre en gitt funksjon. Nå: programmer for å utføre programmer. Interpreter / evaluator for et programmeringsspråk: Et program som utfører intstruksjonene skrevet i et programmeringsspråk. En evaluator for et program er altså bare nok et program. En innsikt som kan virke selvsagt men likevel er fundamental og dyp!

Evaluering av språk 5 Så langt: programmer for å utføre en gitt funksjon. Nå: programmer for å utføre programmer. Interpreter / evaluator for et programmeringsspråk: Et program som utfører intstruksjonene skrevet i et programmeringsspråk. En evaluator for et program er altså bare nok et program. En innsikt som kan virke selvsagt men likevel er fundamental og dyp! Scheme/Lisp er veldig egnet for å skrive evaluatorer gitt støtten for å manipulere symbolske data. I kap. 4 skal vi skrive en metasirkulær evaluator en evaluator skrevet i samme språket som den skal evaluere: En evaluator for Scheme, i Scheme.

Hvorfor en evaluator for Scheme i Scheme?! 6 Gjør omgivelsesmodellen eksplisitt. Bedre forståelse for hvordan ulike uttrykk evalueres. Lar oss eksperimentere med alternativ syntaks og semantikk. Illustrerer en generell evaluator-struktur som også vil kunne brukes for andre ( uttrykksbaserte ) språk. Viser hvordan program er data. Kap. 4 kan tidvis virke veldig mystisk, men har egentlig til hensikt å avmystifisere.

Litt repetisjon om omgivelser og rammer 7 En omgivelse er en sekvens av rammer. En ramme er en tabell som binder variabelnavn til verdier. Den globale omgivelsen beststår av én enkelt ramme (bl.a. med bindingene for primitive prosedyrer). define legger til bindinger i en ramme, set! endrer dem. Variabler har sin verdi relativ til en gitt omgivelse, definert ved den første rammen med en binding.

Litt repetisjon om omgivelser og rammer 7 En omgivelse er en sekvens av rammer. En ramme er en tabell som binder variabelnavn til verdier. Den globale omgivelsen beststår av én enkelt ramme (bl.a. med bindingene for primitive prosedyrer). define legger til bindinger i en ramme, set! endrer dem. Variabler har sin verdi relativ til en gitt omgivelse, definert ved den første rammen med en binding. En prosedyre lages ved å evaluere et lambda-uttrykk i en gitt omgivelse: Resultatet er et prosedyreobjekt som består av formelle parametere, kropp, og en peker til omgivelsen der den ble opprettet.

Omgivelser og rammer i evaluatoren 8 Evaluatoren implementerer en omgivelse som en liste av rammer. En sekvens av tabeller. cdr gir oss den omsluttende omgivelsen. Rammer er implemenert som par med to lister; en med symbolene og en med de tilsvarende verdiene. Evaluatoren er egentlig en implementasjon av omgivelsesmodellen:

Omgivelsesmodellen for evaluering 9 Evalueringsreglene i omgivelsesmodellen For å evaluere et sammensatt uttrykk, evaluer del-uttrykkene rekursivt og anvend operator-verdien på operand-verdiene.

Omgivelsesmodellen for evaluering 9 Evalueringsreglene i omgivelsesmodellen For å evaluere et sammensatt uttrykk, evaluer del-uttrykkene rekursivt og anvend operator-verdien på operand-verdiene. For å anvende en prosedyre på argumenter, utvid omgivelsen til prosedyrobjektet med en ny ramme der de formelle parameterene er bundet til argumentene prosedyren kalles på, og evaluer prosedyrekroppen i denne nye omgivelsen.

Omgivelsesmodellen for evaluering 9 Evalueringsreglene i omgivelsesmodellen For å evaluere et sammensatt uttrykk, evaluer del-uttrykkene rekursivt og anvend operator-verdien på operand-verdiene. For å anvende en prosedyre på argumenter, utvid omgivelsen til prosedyrobjektet med en ny ramme der de formelle parameterene er bundet til argumentene prosedyren kalles på, og evaluer prosedyrekroppen i denne nye omgivelsen. Fortsetter helt til uttrykkene er redusert til selv-evaluerende atomer, symboler og primitive prosedyrer (kalles direkte uten ny omgivelse).

Omgivelsesmodellen for evaluering 9 Evalueringsreglene i omgivelsesmodellen For å evaluere et sammensatt uttrykk, evaluer del-uttrykkene rekursivt og anvend operator-verdien på operand-verdiene. For å anvende en prosedyre på argumenter, utvid omgivelsen til prosedyrobjektet med en ny ramme der de formelle parameterene er bundet til argumentene prosedyren kalles på, og evaluer prosedyrekroppen i denne nye omgivelsen. Fortsetter helt til uttrykkene er redusert til selv-evaluerende atomer, symboler og primitive prosedyrer (kalles direkte uten ny omgivelse). Special forms har sine egne evalueringsregler.

Evaluatorens deler 10 Abstrakte datastrukturer for å representere omgivelser, prosedyrer, etc. Diverse prosedyrer som definerer syntaksen til uttrykkene i språket. eval og apply og spesialiserte varianter av disse som gir semantikken til special forms. Mekanisme for å kalle primitive / innebygde prosedyrer. REPL

Seksjon 4.1.2: Representasjon av uttrykk 11 Evaluatoren vår er en prosedyre som tar program- / kildekode som argument. Men for evaluatoren er programmet / koden bare symbolske data som vi kan manipulere på vanlig måte. Vi trenger prosedyrer for å klassifisere og plukke fra hverandre uttrykk. Implementert som abstraksjonsbarrierer. F.eks; i stedet for å hardkode alle steder at definisjoner er lister som begynner med symbolet define bruker vi et predikat definition?

Seksjon 4.1.2: Representasjon av uttrykk (forts.) 12 Nøyaktig hvordan alle konstruktorene, aksessorene og predikatene for ulike uttrykk er definert er ikke så interessant i seg selv. Men hva disse abstraksjonene betyr er interessant! De definerer syntaksen for språket.

Seksjon 4.1.2: Representasjon av uttrykk (forts.) 12 Nøyaktig hvordan alle konstruktorene, aksessorene og predikatene for ulike uttrykk er definert er ikke så interessant i seg selv. Men hva disse abstraksjonene betyr er interessant! De definerer syntaksen for språket. Ved å endre på prosedyrene her kan vi endre på den syntaktiske representasjonen, f.eks: (square := (lambda (x) (* x x))) (if test1 then alt1 elsif test2 then alt2 else alt3 )

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

mc-eval (define (mc-eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((special-form? exp) (eval-special-form exp env)) ((application? exp) (mc-apply (mc-eval (operator exp) env) (list-of-values (operands exp) env))))) (define (list-of-values exps env) (if (no-operands? exps) () (cons (mc-eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) Tar et uttrykk og en omgivelse: Analyserer typen til uttrykket (basert på tagged-list?) og evaluerer i henhold til dette. Hver special form krever sin egen behandling. Ved prosedyrekall: Evaluerer rekursivt operator- og operand-uttrykkene og kaller mc-apply på resultatet. 13

Evaluering av special forms 14 (define (eval-special-form exp env) (cond ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-assignment exp env)) ((definition? exp) (eval-definition exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (make-procedure (lambda-parameters exp) (lambda-body exp) env)) ((begin? exp) (eval-sequence (begin-actions exp) env)) ((cond? exp) (mc-eval (cond->if exp) env)))) Alle special forms har egne evaluerings regler. F.eks: if: evaluer konsekventen dersom predikatet evaluerer til sant, eller alternativet om det er usant. lambda: gjøres om til en liste av parametere, kropp og omgivelse, tagget med procedure.

Evaluering av special forms 14 (define (eval-special-form exp env) (cond ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-assignment exp env)) ((definition? exp) (eval-definition exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (make-procedure (lambda-parameters exp) (lambda-body exp) env)) ((begin? exp) (eval-sequence (begin-actions exp) env)) ((cond? exp) (mc-eval (cond->if exp) env)))) Alle special forms har egne evaluerings regler. F.eks: if: evaluer konsekventen dersom predikatet evaluerer til sant, eller alternativet om det er usant. lambda: gjøres om til en liste av parametere, kropp og omgivelse, tagget med procedure.

mc-apply 15 (define (mc-apply proc args) (cond ((primitive-procedure? proc) (apply-primitive-procedure proc args)) ((compound-procedure? proc) (eval-sequence (procedure-body proc) (extend-environment (procedure-parameters proc) args (procedure-environment proc)))))) (define (eval-sequence exps env) (cond ((last-exp? exps) (mc-eval (first-exp exps) env)) (else (mc-eval (first-exp exps) env) (eval-sequence (rest-exps exps) env)))) Klassifiserer prosedyrer som primitive eller sammensatte. Ved sammensatte prosedyrer: Evaluerer hvert uttrykk i prosedyrekroppen i en ny omgivelse med de aktuelle parameter-bindingene.

mc-apply 15 (define (mc-apply proc args) (cond ((primitive-procedure? proc) (apply-primitive-procedure proc args)) ((compound-procedure? proc) (eval-sequence (procedure-body proc) (extend-environment (procedure-parameters proc) args (procedure-environment proc)))))) (define (eval-sequence exps env) (cond ((last-exp? exps) (mc-eval (first-exp exps) env)) (else (mc-eval (first-exp exps) env) (eval-sequence (rest-exps exps) env)))) Klassifiserer prosedyrer som primitive eller sammensatte. Ved sammensatte prosedyrer: Evaluerer hvert uttrykk i prosedyrekroppen i en ny omgivelse med de aktuelle parameter-bindingene.

mc-apply 15 (define (mc-apply proc args) (cond ((primitive-procedure? proc) (apply-primitive-procedure proc args)) ((compound-procedure? proc) (eval-sequence (procedure-body proc) (extend-environment (procedure-parameters proc) args (procedure-environment proc)))))) (define (eval-sequence exps env) (cond ((last-exp? exps) (mc-eval (first-exp exps) env)) (else (mc-eval (first-exp exps) env) (eval-sequence (rest-exps exps) env)))) Klassifiserer prosedyrer som primitive eller sammensatte. Ved sammensatte prosedyrer: Evaluerer hvert uttrykk i prosedyrekroppen i en ny omgivelse med de aktuelle parameter-bindingene.

Gjensidig rekursjon 16 Kjernen i evaluatoren eval; tar et uttrykk og en omgivelse, og kaller apply med en prosedyre og argumenter. apply; tar en prosedyre og argumenter, og kaller eval med et uttrykk og en omgivelse. Hvordan får vi noen gang et svar? Hva er basistilfellene?

Prøvekjøring 17 Vi tester noen uttrykk mot mc-eval i DrRacket. For hvert uttrykk går vi skritt for skritt igjennom evaluator-koden.? (set! the-global-environment (setup-environment))? (define global the-global-environment) ;; alias? global? (mc-eval 3 global)? (mc-eval (+ 1 2) global)? (mc-eval (+ 1 2) global)? (mc-eval (+ (+ 1 2) (+ 3 4)) global)? (mc-eval (lambda (x) (+ 10 x)) global)? (mc-eval (define foo (lambda (x) (+ 10 x))) global)? (mc-eval (foo 32) global)

REPL 18 (define (read-eval-print-loop) ;;tilsvarer driver-loop i SICP (prompt-for-input input-prompt) (let ((input (read))) (let ((output (mc-eval input the-global-environment))) (announce-output output-prompt) (user-print output))) (read-eval-print-loop)) (define (start-repl) (set! the-global-environment (setup-environment)) (read-eval-print-loop)) Vi kan bruke read siden vi evaluerer Scheme/Lisp. Leser inn Scheme-uttrykk i én jafs. Hvis vi skulle skrevet en interpreter for et helt annet språk måtte vi heller bruke f.eks read-char.

En slags veiledning i hvordan lese kap. 4 19 Mengden kode kan virke overveldende. Det viktige er ikke å ha finlest all koden men å forstå prinsippene. Spesielt gjelder dette de syntaktiske abstraksjonene i seksjon 4.1.2. Ta gjerne for deg én eller to special forms, f.eks if og lambda og sett deg inn i hvordan de fungerer.

En slags veiledning i hvordan lese kap. 4 19 Mengden kode kan virke overveldende. Det viktige er ikke å ha finlest all koden men å forstå prinsippene. Spesielt gjelder dette de syntaktiske abstraksjonene i seksjon 4.1.2. Ta gjerne for deg én eller to special forms, f.eks if og lambda og sett deg inn i hvordan de fungerer. Ikke fokuser på hvordan primitive / innebygde prosedyrer behandles; dette er delvis magi og delvis en distraksjon fra de viktige ideene her!

En slags veiledning i hvordan lese kap. 4 19 Mengden kode kan virke overveldende. Det viktige er ikke å ha finlest all koden men å forstå prinsippene. Spesielt gjelder dette de syntaktiske abstraksjonene i seksjon 4.1.2. Ta gjerne for deg én eller to special forms, f.eks if og lambda og sett deg inn i hvordan de fungerer. Ikke fokuser på hvordan primitive / innebygde prosedyrer behandles; dette er delvis magi og delvis en distraksjon fra de viktige ideene her! Merk hvordan omgivelsesmodellen og evaluatoren speiler hverandre. Og samspillet mellom eval og apply.

En slags veiledning i hvordan lese kap. 4 19 Mengden kode kan virke overveldende. Det viktige er ikke å ha finlest all koden men å forstå prinsippene. Spesielt gjelder dette de syntaktiske abstraksjonene i seksjon 4.1.2. Ta gjerne for deg én eller to special forms, f.eks if og lambda og sett deg inn i hvordan de fungerer. Ikke fokuser på hvordan primitive / innebygde prosedyrer behandles; dette er delvis magi og delvis en distraksjon fra de viktige ideene her! Merk hvordan omgivelsesmodellen og evaluatoren speiler hverandre. Og samspillet mellom eval og apply. Med en metasirkulær evaluator blir det ekstra viktig å være var på skillet mellom implementeringsspråk og implementert språk.

Neste gang 20 Mer meta. Mer sirkularitet. Optimisering av evaluatoren med memoisering. Endringer av syntaksen og semantikken til språket.