PODMINKY: ========= Celkovy pocet bodu = 24 = (12 + 12) Minimalni pocet bodu 14 ~= 60% Pan Konecny vypise soutez, kdo uspeje nema NOVĚ nárok na zápočet. Ucast na cvicenich je dobrovolna, byt prakticky NEZBYTNA! ukoly na adrese: phoenix.inf.upol.cz/~procpa01/ Bodova skladba -------------- - povinná účast (minimálně 75 %, jinak individuální domluva - např. doložit důvod nepřítomnosti + úkoly navíc) - 2 písemky (půlka semestru, konec semestru) - na zápočet získat minimálně 60 % bodů (v součtu) - jedna opravná písemka - úkoly na doma jsou nově nepovinné ale doporučené (bude k nim přihlédnuto v případě mírného nedostatku bodů) OPAKOVANI Z PAPR1: ================== 1) priklad ========== (if #f (ArqQfrQDXQW) (print 'here)) (= 1 (/ 2 2)) (if (- (* 3 2) (+ 1 5)) 1 2) (if (cdr '(1)) #t #f) (and) (or) 2) Currying/ Prostredi ====================== (define curry+ (lambda (c) (lambda (x) (+ x c)))) Co se stane kdyz a proc? (curry+ 10 2) ((curry+ 10) 5) ((lambda (x) (+ x 10)) 5) ((curry+ 5) 10 11) ((curry+ 2) ((curry+ 3) 2)) 3) Faktorial 4) Y-kombinator ================ ((lambda (y x) (y y x)) (lambda (y x) (if (<= x 1) 1 (* (y y (- x 1)) x))) 4) ((lambda (y x) (y y x)) (lambda (y x) (if (null? x) 0 (+ (y y (cdr x)) 1))) '(1 2 3)) 5) Pow^n ====== (define ^ (lambda (x n) (if (= n 1) x (* x (^ x (- n 1)))))) (define mylen (lambda (l) (if (equal? l '()) 0 (+ (mylen (cdr l)) 1)))) (length (cons 1 2)) 6) Prace s pary/seznamy ================ - zavedeni pojmu PAR (cons value next) - procedura car vrati hodnotu value - procedura cdr vrati hodnotu next - podobne jako v Ccku struktura, ktera ale zde ma povinne nejvyse dve polozky (implementace v ccku) typedef struct Cons{ void * car; void * cdr; }Cons; - interpret schemeu (napsany v ccku) ji takto skutecne implementuje PR: (cons + -) ((car (cons + -)) 1 2) => ((cdr (cons + -)) 1 2) => POZN: Polozky value i next muze obsahovat zase PAR! PR: ((car (car (cons (cons + -) (cons * /)))) 5 6) => ? ((cdr (cdr (cons (cons + -) (cons * /)))) 5 6) => ? - Rekurentni zavedeni pojmu SEZNAM I) null neboli '() je seznam (odpovida totiz pointeru NULL vsimnete si analogie!) II) vyraz tvaru (cons a b), kde b je seznam je seznam. PR: Manuelni/Otrocke vytvoreni seznamu (cons 1 (cons 2 (cons 3 null))) lze prepsat syntactic sugarem (syntaktickym cukrem) '(1 2 3) nebo (list 1 2 3), vsechny 3 zapisy jsou ale STEJNE! Pozor, nemusi platit vzdy - quote je specialni forma - nevyhodnocuje argument! 7) Kvazikvotovani: =============== (define x 3) (quasiquote x) => (quasiquote (unquote x)) => (quasiquote (unquote (+ 1 2))) => (quasiquote (1 x (unquote (+ 1 x 2)))) => Ukoly na hodine =============== Výpočet konstanty PI (Podle Leibnizova vzorce) ---------------------------------------------- http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80 (leib-pi nmax) nmax ... maximalni pocet kroku sumy (nase "nekonecno") PR: (leib-pi 128) => 3.1493444751246202 Procedura na "zplosteni" seznamu (flat-list) ========================================== (flat-list lst) lst ... vstupni seznam PR: (flat-list '(1 (2 (3 4 (5 6)) 7) 8)) => (1 2 3 4 5 6 7 8) (flat-list '((1) (2) (hello))) => (1 2 hello) Ukol na doma - L-systemy - viz. web ===================================