This shows you the differences between two versions of the page.
pp:21:laboratoare:racket:legare [2021/03/21 12:41] bot.pp created |
pp:21:laboratoare:racket:legare [2021/03/23 10:05] (current) andrei.olaru [Referințe] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Racket: Legarea variabilelor. Închideri funcționale ====== | ====== Racket: Legarea variabilelor. Închideri funcționale ====== | ||
- | * Responsabil: [[teodor98sz@gmail.com|Teodor Szente]] | + | * Data publicării: 22.03.2021 |
- | * Data publicării: 08.03.2020 | + | |
===== Obiective ===== | ===== Obiective ===== | ||
Line 23: | Line 22: | ||
**Domeniul de vizibilitate** al unei variabile este mulțimea punctelor din program în care variabila este vizibilă. Cu alte cuvinte, domeniul de vizibilitate al variabilei x este reprezentat de porțiunile din program în care aceasta poate fi accesată (este vizibilă). | **Domeniul de vizibilitate** al unei variabile este mulțimea punctelor din program în care variabila este vizibilă. Cu alte cuvinte, domeniul de vizibilitate al variabilei x este reprezentat de porțiunile din program în care aceasta poate fi accesată (este vizibilă). | ||
- | **Exemplu:** Domeniul de vizibilitate pentru variabila a este format din liniile de cod ''%%{9, 10, 11, 12, 13, 14}%%'' {{D :20:laboratoare:racket:domeniu_vizibilitate.png?800 |}} | + | **Exemplu:** Domeniul de vizibilitate pentru variabila a este format din liniile de cod ''%%{9, 10, 11, 12, 13, 14}%%'' {{domeniu_vizibilitate.png?800 |}} |
===== Context computaţional ===== | ===== Context computaţional ===== | ||
Line 33: | Line 32: | ||
**Exemplu:** Pe linia 6 contextul computaţional este: ''%%{(a 2) (b 32) (s P)}%%'' | **Exemplu:** Pe linia 6 contextul computaţional este: ''%%{(a 2) (b 32) (s P)}%%'' | ||
- | {{ :20:laboratoare:racket:context.png?800 |}} | + | {{context.png?800 |}} |
===== Legare ===== | ===== Legare ===== | ||
Line 43: | Line 42: | ||
<code> | <code> | ||
int random_number = 42; | int random_number = 42; | ||
- | // | | | + | // | | |
- | // | |-------► valoarea variabilei la un moment dat.` | + | // | |-------► valoarea variabilei la un moment dat.` |
- | // ▼` ` | + | // ▼ |
// "random_number" este valoarea identificatorului. | // "random_number" este valoarea identificatorului. | ||
Line 71: | Line 70: | ||
Legarea statică creează un nou domeniu de vizibilitate (scope) pentru o variabilă, în funcţie de contextul lexical al programului (partea programului care este evaluată), așa că în literatura de specialitate se mai numește **lexical scoping** / **lexical binding** | Legarea statică creează un nou domeniu de vizibilitate (scope) pentru o variabilă, în funcţie de contextul lexical al programului (partea programului care este evaluată), așa că în literatura de specialitate se mai numește **lexical scoping** / **lexical binding** | ||
- | In racket ''%%let%%'' face legare statică: {{:20:laboratoare:racket:lexical-binding-example.png?800 |}} | + | In racket ''%%let%%'' face legare statică: {{lexical-binding-example.png?800 |}} |
===== Legare dinamică ===== | ===== Legare dinamică ===== | ||
Line 81: | Line 80: | ||
În Scheme (precursorul lui Racket) ''%%define%%'' face legare dinamică: | În Scheme (precursorul lui Racket) ''%%define%%'' face legare dinamică: | ||
- | {{ :20:laboratoare:racket:dynamic-binding-example.png?800 |}} | + | {{dynamic-binding-example.png?800 |}} |
Observați că același apel de funcție cu aceiași parametri întoarce rezultate diferite în funcție de contextul global => **introduce efecte laterale**, de aceea editarea contextului global cu ''%%define%%'' este interzisă în Racket. | Observați că același apel de funcție cu aceiași parametri întoarce rezultate diferite în funcție de contextul global => **introduce efecte laterale**, de aceea editarea contextului global cu ''%%define%%'' este interzisă în Racket. | ||
Line 109: | Line 108: | ||
(let ((a 1) (b (+ a 1))) ; aici suntem in zona de definiții, nu în corpul let-ului =\> a e legat la 10 | (let ((a 1) (b (+ a 1))) ; aici suntem in zona de definiții, nu în corpul let-ului =\> a e legat la 10 | ||
- | (cons a b)) ; în corpul let-ului este vizibilă legarea lui a la 1 | + | (cons a b)) ; în corpul let-ului este vizibilă legarea lui a la 1 |
</code> | </code> | ||
Line 118: | Line 117: | ||
(let ((f (lambda () (print a)))) | (let ((f (lambda () (print a)))) | ||
- | (let ((a 2)) ; a doua legare | + | (let ((a 2)) ; a doua legare |
(f)))) ; afișează 1 | (f)))) ; afișează 1 | ||
Line 126: | Line 125: | ||
==== let* ==== | ==== let* ==== | ||
- | Este asemănător cu ''%%let%%'', însă domeniul de vizibilitate al variabilelor începe imediat după definire. Asta înseamnă că o variabilă definită în ''%%let\*%%'' poate fi folosită în următoarele definiții din cadrul ''%%let\*%%''. | + | Este asemănător cu ''%%let%%'', însă domeniul de vizibilitate al variabilelor începe imediat după definire. Asta înseamnă că o variabilă definită în ''%%let*%%'' poate fi folosită în următoarele definiții din cadrul ''%%let*%%''. |
<code lisp> | <code lisp> | ||
(define a 10) | (define a 10) | ||
- | (let\* ((a 1) (b (+ a 1))) ; în momentul definirii lui b, este vizbilă legarea lui a la 1 | + | (let* ((a 1) (b (+ a 1))) ; în momentul definirii lui b, este vizbilă legarea lui a la 1 |
- | (cons a b)) ; desigur, aceeași legare e vizibilă și în corpul let-ului | + | (cons a b)) ; desigur, aceeași legare e vizibilă și în corpul let-ului |
</code> | </code> | ||
Line 143: | Line 142: | ||
<code lisp> | <code lisp> | ||
(letrec ((a b) (b 1)) ; în momentul definirii lui a este nevoie de valoarea lui b, necunoscută încă | (letrec ((a b) (b 1)) ; în momentul definirii lui a este nevoie de valoarea lui b, necunoscută încă | ||
- | (cons a b)) ; de aceea codul produce eroare | + | (cons a b)) ; de aceea codul produce eroare |
</code> | </code> | ||
<code lisp> | <code lisp> | ||
- | ((even-length? ` | + | (letrec |
+ | ((even-length? | ||
(lambda (L) ; even-length? este o închidere funcțională | (lambda (L) ; even-length? este o închidere funcțională | ||
(if (null? L) ; deci corpul funcției nu este evaluat la | (if (null? L) ; deci corpul funcției nu este evaluat la | ||
Line 184: | Line 184: | ||
* **textul** λ-expresiei ( ''%%(lambda (x) (+ x a))%%'' pe exemplul nostru) | * **textul** λ-expresiei ( ''%%(lambda (x) (+ x a))%%'' pe exemplul nostru) | ||
- | * **contextul** computațional în punctul de definire a λ-expresiei ( ''%%(a 1)``pe exemplul nostru)%%'' | + | * **contextul** computațional în punctul de definire a λ-expresiei ( ''%%(a 1)%%'' pe exemplul nostru) |
Ceea ce salvăm în context este de fapt mulțimea **variabilelor libere** în λ-expresia noastră, adică toate acele variabile referite în textul λ-expresiei dar definite în afara ei. Contextul unei închideri funcționale rămâne cel din momentul creării închiderii funcționale, cu excepția variabilelor definite cu ''%%define%%'', care ar putea fi înlocuite în timp. | Ceea ce salvăm în context este de fapt mulțimea **variabilelor libere** în λ-expresia noastră, adică toate acele variabile referite în textul λ-expresiei dar definite în afara ei. Contextul unei închideri funcționale rămâne cel din momentul creării închiderii funcționale, cu excepția variabilelor definite cu ''%%define%%'', care ar putea fi înlocuite în timp. | ||
Line 194: | Line 194: | ||
===== Resurse ===== | ===== Resurse ===== | ||
- | * [[https://docs.racket-lang.org/reference/let.html|Documentație racket]] | + | * [[https://ocw.cs.pub.ro/courses/_media/pp/21/laboratoare/racket/legare.zip|Exerciții propuse]] |
- | * | + | * [[https://ocw.cs.pub.ro/courses/_media/pp/21/laboratoare/racket/legare-sol.zip|Soluții]] |
- | * | + | * [[https://github.com/cs-pub-ro/PP-laboratoare/raw/master/racket/legare/legare-cheatsheet.pdf|Cheatsheet Laboratorul 4]] |
- | * | + | |
===== Referințe ===== | ===== Referințe ===== | ||
+ | * [[https://docs.racket-lang.org/reference/let.html|Documentație Racket]] | ||
* [[https://www.cs.oberlin.edu/~bob/cs275.spring14/Examples%20and%20Notes/February/Februrary%2028/Lexical%20and%20Dynamic%20Binding.pdf|Lexical Binding]] | * [[https://www.cs.oberlin.edu/~bob/cs275.spring14/Examples%20and%20Notes/February/Februrary%2028/Lexical%20and%20Dynamic%20Binding.pdf|Lexical Binding]] | ||
* [[https://www.emacswiki.org/emacs/DynamicBindingVsLexicalBinding|legare statica vs legare dinamica]] | * [[https://www.emacswiki.org/emacs/DynamicBindingVsLexicalBinding|legare statica vs legare dinamica]] |