Sideeekter og makroer i Lisp

Like dokumenter
Lisp 3: Spesielle former, variabler, imperativ programmering

Lisp 5: Makroer. Programvareverkstedet. 29. april 2010

LISP PVV-kurs 25. oktober 2012

LISP PVV-kurs 11. mars 2010

Lisp 2: Lister og funksjoner

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

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Eksamensforberedelser

Øvingsforelesning 3 Python (TDT4110)

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

Høyere-ordens prosedyrer

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

Bygge en pyramide. Introduksjon. Steg 1: Lage en ny mod. Sjekkliste. Skrevet av: Pål G. Solheim

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

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

Lynkurs i shellprogrammering under Linux

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. En metasirkulær evaluator

Mattespill Nybegynner Python PDF

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

Velkommen til MAT1030!

MAT1030 Diskret Matematikk

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Forkurs i informatikk Python. Andreas Færøvig Olsen

INF2810: Funksjonell Programmering. Mer om strømmer

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering

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

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

TDT Øvingsforelesning 1. Tuesday, August 28, 12

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. Tilstand og verditilordning

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

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

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

MAT1030 Plenumsregning 1

UNIVERSITETET I OSLO

Vi som skal undervise. MAT1030 Diskret matematikk. Hva er diskret matematikk? Hva er innholdet i MAT1030?

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Bygge en pyramide. Steg 1: Lage en ny mod. Sjekkliste. Introduksjon

MAT1030 Forelesning 2

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

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

Eksamen i SLI230, vår 2003.

MAT1030 Diskret Matematikk

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

Matematikk Øvingsoppgaver i numerikk leksjon 5 for-løkker

MAT1030 Diskret Matematikk

Oppsummering fra sist

Oppgave 1 Hva tror du følgende program skriver ut til terminalen? Diskuter med gruppen.

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

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

INF2810: Funksjonell Programmering. Tilstand og verditilordning

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

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

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

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell Programmering. Muterbare data

TDT4102 Prosedyreog objektorientert programmering Vår 2016

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

Newtons metode er en iterativ metode. Det vil si, vi lager en funksjon. F x = x K f x f' x. , x 2

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Øvingsforelesning 5 Python (TDT4110)

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

C# (.Net) Tema: Loops (Løkker) Leksjon 7 Kap 18

Læreboken på 45 minutter

Obligatorisk oppgave MAT-INF1100. Lars Kristian Henriksen UiO

1. Rullende navn, s 3 2. Smilefjes, s 5 3. Skritteller, s 7 4. Orakel, s 9 5. Stein, saks og papir, s Kompass, s 14

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

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

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.

MAT1030 Plenumsregning 3

Transkript:

Sideeekter og makroer i Lisp PVV-kurs 18. mars 2010

Oversikt over kurset (Del 4: Imperativ programmering (utsatt fra forrige kurs)) (Del 5: Makroer) (Del 6: Eksempel: Postmodern)

Eirik Alderslyst Nygaard Øystein Ingmar Skartsæterhagen Programvareverkstedet 18. mars 2010

(Funksjonell programmering) (Alle eksempler vi har vist til nå har vært skrevet i funksjonell stil) (Alt en funksjon gjør er å produsere en returverdi, og denne verdien avhenger kun av argumentene til funksjonen) (Hvis en funksjon kalles ere ganger med samme argumenter, returnerer den det samme hver gang) (Dette gjør programmene ryddige, men enkelte ting blir vanskelige å implementere)

(SETF) (setf ting verdi) (SETF erstatter verdien i en ting med en ny verdi)

(SETF-eksempel) (defvar *x* 5) *X* *x* 5 (setf *x* (+ *x* 3)) 8 *x* 8 (setf *x* (list 1 2 3)) (1 2 3) (setf (first *x*) 5) 5 *x* (5 2 3)

(READ og PRINT) (READ brukes til å lese inn et lisputtrykk. Uttrykket vil bli parset og returnert som vanlige lisp-objekter) (PRINT skriver ut lisp-objekter i en leselig form (den samme representasjonen som READ leser inn) (first (read)) (1 2 3) 1 (+ (read) (read)) 40 2 42 (print (list 1 2 3)) (1 2 3) (1 2 3)

(FORMAT) (FORMAT brukes til å skrive ut formatert tekst) (format destinasjon formatstreng argumenter ) (Destinasjonen kan være en strøm, T eller ) (format t "Hello, world!") Hello, world! (format nil "Hello, world!) "Hello, world!" (format *standard-output* "Hello, world!") Hello, world!

(FORMAT med enkle argumenter) (format t "Dagens tall er: ~D~%" (random 10)) Dagens tall er: 4 (format t "Jeg heter ~S og er ~D år gammel~%" "John" 82) Jeg heter "John" og er 82 år gammel (format t "Dagens gullkorn er: ~A~%" "Sometimes the appropriate response to reality is to go insane.") Dagens gullkorn er: Sometimes the appropriate response to reality is to go insane.

(FORMAT kan skrive ut tall på forskjellige måter) (format t "~R~%" 1501205) one million five hundred one thousand two hundred five (format t "~:R ~:R ~:R~%" 1 2 5) first second fifth (format t "~@R ~@R ~@R~%" 1 130 1259) I CXXX MCCLIX (FORMAT lar deg skrive ut tall med sine engelske navn eller som det romerske tallsystemet)

(FORMAT og yttall) (format t "~F~%" 3.14159) 3.14159 (format t "~,2F~%" 3.14159) 3.14 (format t "~,2E~%" 123456) 1.23e+5 (format t "~,2,3F" 2.3) 2300.00

(FORMAT med lister og litt mer) (format t "~{~A, ~}" '(1 2 3)) 1, 2, 3, (format t "~{~A~^, ~}" '(1 2 3)) 1, 2, 3 (format t "~{~{~10@<~:(~r~)~>~}~%~}" '((1 2) (3 4) (5 6))) One Two Three Four Five Six (FORMAT lar deg skrive ut og formatere lister som du selv vil)

(Iterasjon) (Endring av tilstand) (Spesielle iterasjonsoperatorer) (LOOP) (Alt som kan uttrykkes iterativt kan også uttrykkes rekursivt) (Har sett: Minne- og hastighetsfordelene med iterasjon kan også oppnås med halerekursjon) (Iterasjon er altså egentlig ikke nødvendig) (Men det nnes likevel iterasjonsoperatorer)

(Spesielle iterasjonsoperatorer) (LOOP) (Gjenta noe et antall ganger: DOTIMES) (dotimes (i 10) (format t "~D" i)) 0123456789 (dotimes (variabel ganger ) ting-å-gjøre )

(Iterer over en liste: DOLIST) (Spesielle iterasjonsoperatorer) (LOOP) (dolist (a '(foo bar baz)) (format t "~A " a)) FOO BAR BAZ (dolist (variabel liste ) ting-å-gjøre )

(Generell iterasjon: LOOP) (Spesielle iterasjonsoperatorer) (LOOP) (LOOP: sveitsisk arméiterasjonsform) (LOOP kan brukes til å skrive for-løkker, while-løkker, foreach-løkker og andre rare løkker) (LOOP er et eget lite programmeringsspråk)

(Spesielle iterasjonsoperatorer) (LOOP) (LOOP FOR) (loop for num in '(1 2 3) do (format t "Item: ~A~%" num)) Item: 1 Item: 2 Item: 3 (loop for num from 1 to 3 do (format t "Item: ~A~%" num)) Item: 1 Item: 2 Item: 3

(Spesielle iterasjonsoperatorer) (LOOP) (Generering av verdier med LOOP) (loop for num in '(1 2 3) sum num) 6 (loop for num in '(1 5 2) maximize num) 5

(Spesielle iterasjonsoperatorer) (LOOP) (Generering av lister med LOOP) (Loop kan gjøre noe med hvert element i en liste og returnere en ny liste med resultatene) (loop for num in '(1 2 3) collect (* 2 num)) (2 4 6) (Det er også mulig å traversere ere lister samtidig) (loop for x in '(1 2 3) for y in '(10 20 30) collect (+ x y)) (11 22 33)

(Spesielle iterasjonsoperatorer) (LOOP) (Betingelser i LOOP) (loop for x from 1 to 5 if (evenp x) do (format t "~A is even~%" x) else do (format t "~A is odd~%" x)) 1 is odd 2 is even 3 is odd 4 is even 5 is odd (Vi kan få deler av løkken til å bli utført kun på visse betingelser) (Og mye mye mye mer)

(Oppgaver) (Oppgaver) 1 Skriv en ikkerekursiv funksjon som beregner fakultet av et heltall, ved hjelp av LOOP. 2 Skriv en funksjon PRINT-LIST som tar inn en liste og skriver den ut med ett element på hver linje, nummerert med romertall: (print-list '(foo bar baz)) I. FOO II. BAR III. BAZ

(Oppgaver) (Løsningsforslag:!) (defun! (n) (let ((n! 1)) (loop for i from 2 to n do (setf n! (* n! i))) n!)) (defun! (n) (reduce #'* (loop for i from 2 to n collect i)))

(Oppgaver) (Løsningforslag: PRINT-LIST) (defun print-list (list &optional (stream t)) (loop for i from 1 for elem in list do (format stream "~8<~@R~>. ~A~%" i elem)))