Racket, lenivé vyhodnocovanie, makrá Flashcards
Opis racket ako jazyk
funkcionálny jazyk, vychádzajúci z jazyka Scheme
lambdafunkcie,uzávery,…
ale má aj imperatívne vlastnosti
* meniteľné premenné
* funkcie s vedľajšími efektami
Aky dynamicky typovy system pouziva?
dynamický
* počas kompilácie sa nerobí statická typová kontrola
* kompilátor akceptuje viac programov, ale chyba nastane pri behu
Ake vyhodnocovanie argumentov ma racket?
striktné
Cim musi zacinat racket program?
lang racket ;aby sa zvolil správny jazyk
Z coho pozostava racket program?
z termov.
Term je:
* atóm – napríklad #t, #f, 1, 2.0, null, “hello”, x, . . .
* špeciálna forma – napríklad define, lambda, if (podla makier)
* postupnosť – niekoľko termov oddelených medzerou vzátvorkách (t1 t2 … tn)
Co je (t1 t2 … tn)?
- ak t1 je špeciálna forma, tak sémantika postupnosti je špeciálna
- inak ide o volanie funkcie t1 s argumentami t2, . . . , tn
Ako definujeme premenne?
(define x 42) – priradí 42 do premennej x
(define x (+ (* 4 10) 2)) – volanie funkcie, vždy v prefixovom plne uzátvorkovanom tvare (f a1 a2 . . . an)
Ako vieme definovat funkciu?
(define cube (lambda (x) (* x x x)))
(define (cube x) (* x x x)) – syntaktický cukor
Kolko argumentove funkcie ma racket?
viac, nie je ako haskell
ale aj s premenlivym poctom
Aké výhody prináša totálne zátvorkovanie?
konverzia zdrojového kódu do abstraktného syntaktického stromu je triviálna (parsovanie)
netreba riešiť prioritu operátorov
rozdelenie do riadkov a odsadenie je voliteľné a ľahko
automatizovateľné
Aky je problem so zatvorkami?
(* (+ 1 2) (- 3 1)) 6
(* ((+ 1 2)) (- 3 1)) application: not a procedure
(* ((+) 1 2) (- 3 1)) application: not a procedure
bez statickej typovej kontroly sa chýbajúce/nadbytočné zátvorky prejavia až za behu
Aku syntax ma if?
(if podmienka true-výraz false-výraz)
Aku syntax ma cond?
slide 10
Co ak nezakoncime cond else alebo #t?
v tom prípade ale môže cond vrátiť #<void>
prítomnosť #<void> sa dá testovať pomocou void?</void></void>
Porovnaj zoznamy v haskelli a v rackete
slide 12
Co pouzivame na head/tail? Preco take nazvy?
car – “Contents of the Address part of Register”
cdr – “Cont. of the Decrement part of Reg.” (čítaj “could-er”)
co je zoznam vlastne?
iba vlastne špeciálny prípad vnorených dvojíc konciacich null
Aka je vyhoda a nevyhoda dynamickej kontroly typov?
nedokáže pri kompilácii odhaliť všetky chyby
ale umožňuje vytvárať flexibilnejšie DŠ a programy
napr sum listu aj s ne-int prvkami, ktore berie default ako 0, slide 18
Co robi let?
vyhodnocuje priradenia vo vonkajšom kontexte, nezahŕňajúc aktuálne definované premenné
nemôžeme sa odvolávať na neskôr definované premenné
co robi let*?
pracuje rovnako ako let ale po definovaní lokálnej premennej je viditeľná aj v nasledujúcich definíciách v let*
taktiež sa nemôžeme odvolávať na neskôr definované premenné
Co je vhodne na vymenu premennych?
(let ([x y] [y x]) (list x y)) lebo
(let* ([x y] [y x]) (list x y)) -> (y,y)
Na co je letrec?
pracuje rovnako ako let ale môžeme sa odvolávať aj na neskoršie definované premenné (nemôžeme použiť ich obsah)
nemôžeme opakovane definovať tú istú premennú:
vôbec nie je vhodný na výmenu premenných
Opis menitelne premenne so set!
slide 22
Co su mcons?
meniteľné páry
set-car! a set-cdr!
mcons, mcar, mcdr, mpair?, set-mcar! a set-mcdr!
car,… (vrátane length atď.) sa nedajú použiť na mcons-bunku
Ake vyhodnocovanie ma racket?
striktne
Kedy sa v rackete vyhodnocuju vetvy v if?
až podľa podmienky
Co je thunk? Naco je dobry?
funkcie nevyhodnocujú svoje telo až do zavolania
(lambda () e) je thunk pre e
thunk sa ako argument nevyhodnocuje, už je hodnotou
Zhrn thunks
slide 26
((lambda () (+ 1 2))) sa vyhodnotí na 3
(lambda () (+ 1 2)) ale nie
Co robi begin?
vyhodnotí postupne všetky svoje argumenty (zľava doprava) a vráti hodnotu posledného
Na co je lazy eval?
Ak drahý výpočet nemá vedľajšie efekty, tak by sme chceli:
* nepočítať ho pokiaľ ho nebude treba,
* výsledok odložiť pre ďalšie použitia.
Pomocou coho vieme lazy eval implementovat v rackete?
Thunks a mcons
Opis lazy eval na slide 29
slide 29
Co to su makra?
popisuje ako transformovať novú syntax do syntaxe v pôvodnom jazyku - vlastny syntakticky cukor
Co je to makro system?
jazyk pre definíciu makier
* môže to byť podjazyk iného väčšieho jazyka
* môže byť s ním úzko prepojený (tokenizácia, scoping)
Co je to rozbalenie makier (macro expansion)?
prepísanie každého použitia makra do syntaxe pôvodného jazyka predtým než sa program vôbec začne kompilovať
daj priklady na makra
slide 31
Co je problem s tokenizaciou pri makrach?
tokenization – chceme, aby makrá nepracovali na znakoch ale tokenoch, aby sme sa vyhli falošnej detekcii použitia makra
napríklad: nech sa makro head rozbalí na car, ale nie head-less na car-less
Co je problem s makrami v C++?
slide 32
Ako sa v C++ popasovali s problemom makier?
názvy makier sú iba z veľkých písmen, ostatné názvy (premenných, funkcií, . . . ) obsahujú aj malé písmeno
Definuj syntax makier v rackete
slide 34
Aky je problem pri definicii makier dalsi?
slide 35
Ako vieme vyriesit duplicitne volanie?
pomocou lokalnych premennych
slide 36
Opis dalsie problemy s makrami v rackete
slides 36 az koniec toto si pozri…