Racket, lenivé vyhodnocovanie, makrá Flashcards
(43 cards)
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