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:49]
bot.pp
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 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 132: Line 131:
  
 (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>
 (letrec (letrec
-   ​((even-length? ​+   ​((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 195: 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.1616323765.txt.gz · Last modified: 2021/03/21 12:49 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