Haskell vs. Racket, statická vs. dynamická kontrola, eval Flashcards
(44 cards)
(eq? v1 v2) vracia #t ak
v1 a v2 odkazujú na ten istý objekt,
inak vracia #f.
(eq? “Ahoj” “Ahoj”) #t
(eq? “ab” (string-append “a” “b”)) #f
(eq? (cons 1 2) (cons 1 2)) #f
(equal? v1 v2) pre typy ako reťazce, páry, meniteľné páry, a iné porovnáva …
podľa obsahu. Pre páry je rovnosť rekurzívna.
(equal? “Ahoj” “Ahoj”) #t
(equal? “ab” (string-append “a” “b”)) #t
(equal? 2 2.0) #f
(= v1 v2) vracia #t práve vtedy ak
v1 =v2. Akv1 av2 niesú
čísla, vráti chybu
Co je to symbol?
atomická hodnota, ktorá sa vypisuje ako identifikátor so symbolom ’ na začiatku.
Ako vieme zistit ci je nieco symbol?
(symbol? ’a) #t
Co robi string->symbol?
konvertuje reťazec s na symbol ’s.
Ake zlozite je porvnanie symbolov podla eq? a equal?
O(1)
Co robi eval?
umožňuje vytvoriť za behu nové dáta a potom tieto dáta zmeniť na program a vykonať ho
(eval ’(print “Ahoj”))
Co je to quote?
(quote v) je to isté ako ’v
quote zabráni interpretácii symbolov ako identifikátorov a zoznamov ako volaní funkcií
* (quote apple) ’apple
* (quote (1 2 . (3))) (1 2 3)
* (quote 42) 42
Co je to quasiquote a unquote?
(quasiquote v) je to isté ako ‘v
(unquote v) je to isté ako ,v
quasiquote pracuje podobne ako quote, ale pokiaľ narazí na (unquote v), tak vyhodnotí v a nahradí ním (unquote v).
Co vyuzivame v JS? podobne ako quasiquote?
string interpolation
* var n = 42;
* “foo${n}bar” “foo${n}bar”
* ‘foo${n}bar‘ “foo42bar”
Haskell vs Racket
Haskell je akoby podmnožina Racketu. Existujú programy, ktoré Haskell neskompiluje ale Racket áno, ale obsahujú chyby
V haskelli nepotrebujeme funkcie ako number?
v rackete vieme vracať rôzne typy
Aký je Racket z pohľadu Haskell programátora?
Racket akoby mal jeden veľký dátový typ RT. Všetky hodnoty sú práve tohto typu RT:
Co je to staticka kontrola?
akákoľvek činnosť, ktorej úlohou je zamietnuť zlý program po tom, ako sa úspešne sparsoval (vytvoril sa AST), ale ešte pred tým, než sa spustí.
AKé sú nástroje pre dodatočnú statickú kontrolu?
napr. lint
Čo kontroluje statická typová kontrola?
- nájsť chyby ako nesprávne typy argumentov 4/”2”, f v, a f nie je funkcia, if za ktorým nie je bool. výraz, . . .
- vynútenie abstrakcie
- vyhnúť sa kontrole za behu
Ako mozu dynamicky typované jazyky môžu robiť určité stat. kontroly?
použitie nedefinovanej premennej
v jazyku Haskell stat. kontrola nedeteguje nasledovné chyby:
- zavolanie head na prázdnom zozname
- delenie nulou
žiadna statická kontrola nemôže detegovať logické chyby:
- preklep v názve premennej: x namiesto y
- nesprávna podmienka v if
- nesprávny algoritmus
toto si musíme vyriešiť sami :)
Co je ulohou statickej kontroly?
diagnostikovať, či má program chorobu X . Program má chorobu X, ak existuje vstup, na ktorom spraví X.
kedy je staticka kontrola korektna (sound) vzhladom na X?
ak deteguje každý program chorý na X a neprepustí ho
* žiadne falošne negatívne výsledky testov
stat. kontrola je úplná (complete) vzhľadom na X , ak …
každý program, ktorý netrpí X, prejde kontrolou bez nálezu X * žiadne falošne pozitívne výsledky testov
Co je problem s nerozhodnutelnostou pre staticku typovu kontrolu?
Statická kontrola pre skoro každé netriviálne X nemôže súčasne spĺňať nasledovné podmienky:
* je korektná (sound) vzhľadom na X
* je úplná (complete) vzhľadom na X
* na každom programe skončí v konečnom čase
Inak povedané, to, či program trpí X je nerozhodnuteľný problém skoro pre každé netriviálne X.
Kedze chceme aby kompilator vzdy skoncil, od coho upustime?
musíme upustiť od korektnosti alebo úplnosti. Upustime teda od korektnosti