Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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]]
pp/21/laboratoare/racket/legare.1616323264.txt.gz · Last modified: 2021/03/21 12:41 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0