DAT 060: Introduktion till (funktions)programmering. Jacek Malec m. fl. www.cs.lth.se/home/jacek Malec/dat060 Idag: 1. Kursens innehåll 2. Kursens organisation 3. Programmeringsspråket Scheme 4. Introduktion till Scheme Språket Scheme DrScheme uttryck evaluering av uttryck felsökning substitutionsmodellen evalueringsstrategi Program och processer Högre-ordningsprocedurer Jacek Malec, Dept. of Computer Science, Lund University 3 Jacek Malec, Dept. of Computer Science, Lund University 4 Språket Scheme Primitiva uttryck konstanter namn primitiva procedurer DrScheme www.cs.rice.edu/cs/plt/package/drscheme www.cs.lth.se/home/jacek Malec/dat060 Sammansättningsregler Sammansatta uttryck Specialformer Abstraktionsmöjligheter Definition (define) Lambda-abstraktion Blockstruktur - gruppering av procedurer Högre-ordningsprocedurer
Namn Ett namn är en sekvens av tecken som inte utgör ett tal. Konstanter Sanningsvärden: #t, #f Heltal: 3, +4567, -34 Bråk: 3/4, -3/8, +34/5 Flyttal: 3.14159, 4.2e-10, -2e3 Komplexa tal: 3.1+3.1i, 1-1i vecka23 Jacek + -1-2+2 +a.3 http://www.cs.lth.se/ det-är-också-ett-namn-fast-lång Jacek Malec, Dept. of Computer Science, Lund University 7 Jacek Malec, Dept. of Computer Science, Lund University 8 Primitiva procedurer De som redan finns definierade i Scheme: +, -, *, /, expt, log,... sin, cos, tan,... cons, list, append,... read, newline, display,... time, random,... Sammansatta uttryck (uttryck uttryck uttryck...) (procedur argument argument...) (+ 2 3) 3 deluttryck (+2 3) 2 deluttryck (+ (2 3)) 2 deluttryck...
Define (define namn uttryck) (define namn (lambda (param1 param2...) kropp)) Namn kommer att stå för värde av uttryck fr.o.m. nu. Read-eval-print 1. Read Scheme läser in ett uttryck. 2. Evaluate Uttrycket tolkas enligt förutbestämda regler (språkets semantik). Resulterar i ett värde. 3. Print Värdet skrivs ut. Jacek Malec, Dept. of Computer Science, Lund University 11 Jacek Malec, Dept. of Computer Science, Lund University 12 Evaluering av primitiva uttryck Uttryck Värde Utmatning #t true #t #f false #f tal tal namn namns värde 3 talet 3 3 pi pi 3.1415 6/2 talet 3 3 + procedur + #<primitive:+> Evaluering av sammansatta uttryck Tre olika fall f kan vara: 1. en primitiv procedur 2. en egendefinierad procedur 3. en special form (särskilt form)
Evaluering av sammansatta uttryck egendefinierad procedur Evaluering av sammansatta uttryck primitivapplikation f är en primitiv procedur 1. evaluera (beräkna värdet) av f och argumenten 2. utför (lambda (x y) (* (+ x y) 0.5)) (lambda parametrar kropp) Anrop: ((lambda (x y) (* (+ x y) 0.5)) 4 8) ((lambda parametrar kropp) argument) Jacek Malec, Dept. of Computer Science, Lund University 15 Jacek Malec, Dept. of Computer Science, Lund University 16 Att namnge egna procedurer (define medelvärde (lambda (x y) (* (+ x y) 0.5))) Namnet medelvärde tilldelas värdet av lambda-uttrycket, dvs en procedur vars parametrar och kropp anges av lambda-uttrycket. Ibland: (define (medelvärde x y) (* (+ x y) 0.5))) Evaluering av sammansatta uttryck f är en egendefinierad procedur: 1. Beräkna värdet av f och argumenten 2. I f :s kropp ersätt forekomster av formella parametrar med respektive argumentvärde 3. Evaluera kroppen
Omgivningar Fel 1. syntaktisk fel - ett uttryck kan inte tolkas 2. semantisk fel - evalueringsfel uppstår 3. algoritmisk fel - felaktiga resultat fås För att komma ihåg vilket namn är associerat med vilket värde (betydelse av olika namn) måste evaluatorn komma ihåg alla definitioner, associationer mellan namn och värde, etc. För detta används tabeller. Tabellerna initialiseras så att de innehåller alla inbyggda primitiver Sådana tabeller heter omgivningar. Det kan finnas flera! Jacek Malec, Dept. of Computer Science, Lund University 19 Jacek Malec, Dept. of Computer Science, Lund University 20 Ett exempel > (medelvärde 4 8) 6.0 Vad händer? (define medelvärde (lambda (x y) (* (+ x y) 0.5))) Substitutionsmodellen Substitutionsmodellen för evaluering reduktion Ett mekaniskt sätt att tolka uttryck och beräkna deras värde. (medelvärde 4 10) ((lambda (x y) (* (+ x y) 0.5)) 4 10) (* (+ 4 10) 0.5) (* 14 0.5) 6.0 Två sorter: Applikativ reduktion Normal reduktion
Applikativ reduktion f är en egendefinierad procedur: 1. Beräkna värdet av f och argumenten 2. I f :s kropp ersätt forekomster av formella parametrar med respektive argumentvärde 3. Evaluera kroppen Normal reduktion f är en egendefinierad procedur: 1. Beräkna värdet av f 2. I f :s kropp ersätt forekomster av formella parametrar med respektive argument 3. Evaluera kroppen Jacek Malec, Dept. of Computer Science, Lund University 23 Jacek Malec, Dept. of Computer Science, Lund University 24 Special forms Uttryck av följande form tolkas enligt särskilda regler och inte som uttryck som gör proceduranrop (define...) (if...) (cond...) (and...) (or...) (lambda (...)...) Exempel (define invertera (lambda (x) (if (= x 0) +inf.0 (/ 1 x))))
Procedurer vs speciella former > + #<primitive:+> > if keyword: invalid use of keyword if > if (if uttr1 uttr2 uttr3 ) Beräkna uttr1 Om sant, beräkna uttr2 annars beräkna uttr3 Jacek Malec, Dept. of Computer Science, Lund University 27 Jacek Malec, Dept. of Computer Science, Lund University 28 cond cond (cond (predikat1 konsekvens1) (predikat2 konsekvens2)... (predikatn konsekvensn) ) (cond klausul-1 klausul-2... ) Ta en klausul i taget och beräkna klausulens predikatuttryck tills sant värde fås, evaluera sedan resp. konsekvensuttryck. (define ränta (lambda (belopp) (cond ((< belopp 0) 0) ((< belopp 10000) 0.5) ((< belopp 100000) 1.8) ((>= belopp 100000) 2.8)))) (define ränta (lambda (belopp) (cond ((< belopp 0) 0) ((< belopp 10000) 0.5) ((< belopp 100000) 1.8) ((>= belopp 100000) 2.8))))
Indentering and, or (and argument1 argument2...) (or argument1 argument2...) Argumenten evalueras från vänster till höger tills sanningsvärdet för hela uttrycket kan bestämmas. (define abs (lambda (x) (cond ((< x 0) (- 0 x)) ((= x 0) 0) ((> x 0) x)))) eller (define abs (lambda (x) (cond ((< x 0) (- 0 x)) ((= x 0) 0) ((> x 0) x)))) Jacek Malec, Dept. of Computer Science, Lund University 31 Jacek Malec, Dept. of Computer Science, Lund University 32 Exempel Procedurer utan parametrar (define teenager (lambda (age) (if (and (> age 12) (< age 20)) #t #f))) eller (define teenager (lambda (age) (and (> age 12) (< age 20)))) > (define five (lambda () 5)) > (five) 5 > (define five 5) > five 5 >