Racket, lenivé vyhodnocovanie, makrá Flashcards

1
Q

Opis racket ako jazyk

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Aky dynamicky typovy system pouziva?

A

dynamický
* počas kompilácie sa nerobí statická typová kontrola
* kompilátor akceptuje viac programov, ale chyba nastane pri behu

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Ake vyhodnocovanie argumentov ma racket?

A

striktné

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Cim musi zacinat racket program?

A

lang racket ;aby sa zvolil správny jazyk

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Z coho pozostava racket program?

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Co je (t1 t2 … tn)?

A
  • ak t1 je špeciálna forma, tak sémantika postupnosti je špeciálna
  • inak ide o volanie funkcie t1 s argumentami t2, . . . , tn
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Ako definujeme premenne?

A

(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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Ako vieme definovat funkciu?

A

(define cube (lambda (x) (* x x x)))
(define (cube x) (* x x x)) – syntaktický cukor

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Kolko argumentove funkcie ma racket?

A

viac, nie je ako haskell
ale aj s premenlivym poctom

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Aké výhody prináša totálne zátvorkovanie?

A

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é

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Aky je problem so zatvorkami?

A

(* (+ 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Aku syntax ma if?

A

(if podmienka true-výraz false-výraz)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Aku syntax ma cond?

A

slide 10

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Co ak nezakoncime cond else alebo #t?

A

v tom prípade ale môže cond vrátiť #<void>
prítomnosť #<void> sa dá testovať pomocou void?</void></void>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Porovnaj zoznamy v haskelli a v rackete

A

slide 12

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Co pouzivame na head/tail? Preco take nazvy?

A

car – “Contents of the Address part of Register”
cdr – “Cont. of the Decrement part of Reg.” (čítaj “could-er”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

co je zoznam vlastne?

A

iba vlastne špeciálny prípad vnorených dvojíc konciacich null

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Aka je vyhoda a nevyhoda dynamickej kontroly typov?

A

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

19
Q

Co robi let?

A

vyhodnocuje priradenia vo vonkajšom kontexte, nezahŕňajúc aktuálne definované premenné
nemôžeme sa odvolávať na neskôr definované premenné

20
Q

co robi let*?

A

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é

21
Q

Co je vhodne na vymenu premennych?

A

(let ([x y] [y x]) (list x y)) lebo
(let* ([x y] [y x]) (list x y)) -> (y,y)

22
Q

Na co je letrec?

A

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

23
Q

Opis menitelne premenne so set!

A

slide 22

24
Q

Co su mcons?

A

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

25
Q

Ake vyhodnocovanie ma racket?

A

striktne

26
Q

Kedy sa v rackete vyhodnocuju vetvy v if?

A

až podľa podmienky

27
Q

Co je thunk? Naco je dobry?

A

funkcie nevyhodnocujú svoje telo až do zavolania
(lambda () e) je thunk pre e
thunk sa ako argument nevyhodnocuje, už je hodnotou

28
Q

Zhrn thunks

A

slide 26
((lambda () (+ 1 2))) sa vyhodnotí na 3
(lambda () (+ 1 2)) ale nie

29
Q

Co robi begin?

A

vyhodnotí postupne všetky svoje argumenty (zľava doprava) a vráti hodnotu posledného

30
Q

Na co je lazy eval?

A

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.

31
Q

Pomocou coho vieme lazy eval implementovat v rackete?

A

Thunks a mcons

32
Q

Opis lazy eval na slide 29

A

slide 29

33
Q

Co to su makra?

A

popisuje ako transformovať novú syntax do syntaxe v pôvodnom jazyku - vlastny syntakticky cukor

34
Q

Co je to makro system?

A

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)

35
Q

Co je to rozbalenie makier (macro expansion)?

A

prepísanie každého použitia makra do syntaxe pôvodného jazyka predtým než sa program vôbec začne kompilovať

36
Q

daj priklady na makra

A

slide 31

37
Q

Co je problem s tokenizaciou pri makrach?

A

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

38
Q

Co je problem s makrami v C++?

A

slide 32

39
Q

Ako sa v C++ popasovali s problemom makier?

A

názvy makier sú iba z veľkých písmen, ostatné názvy (premenných, funkcií, . . . ) obsahujú aj malé písmeno

40
Q

Definuj syntax makier v rackete

A

slide 34

41
Q

Aky je problem pri definicii makier dalsi?

A

slide 35

42
Q

Ako vieme vyriesit duplicitne volanie?

A

pomocou lokalnych premennych
slide 36

43
Q

Opis dalsie problemy s makrami v rackete

A

slides 36 az koniec toto si pozri…