This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:07-introducere-in-scheme [2015/04/06 15:58] matei.popovici |
laboratoare:07-introducere-in-scheme [2016/04/18 23:56] (current) mihai_dan.masala |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laborator 7 - Introducere in Scheme ===== | ===== Laborator 7 - Introducere in Scheme ===== | ||
+ | ==== Despre Scheme ===== | ||
+ | * Scheme este un limbaj de programare functional, derivat din Lisp si bazat pe modelul formal al **calcului lambda**. | ||
+ | * Scheme este un limbaj de program de uz general,de nivel inalt cu suport pentru operatii cu numere, caractere, stringuri, liste, vectori. | ||
==== Primitivele limbajului ==== | ==== Primitivele limbajului ==== | ||
=== Structura unui program === | === Structura unui program === | ||
- | * Elementul de baza pentru constructia de programe Scheme este **lista**. Un program este o **succesiune de liste**. Exemple: | + | * Elementul de baza pentru constructia de programe Scheme este **lista**. Un program este o **succesiune de liste**. In Scheme, listele sunt incadrate de **'()**. Simbolul ''''' interpreteaza o lista ca **o structura de date**. Absenta acestuia, interpreteaza lista ca un program. |
- | * '''(1 2 3)'' | + | * Exemple de liste: |
- | * '''(1 (2 3) 4)'' | + | * '''(a b c)'' |
- | * '''(1 (+ 2 4) 5)'' | + | * '''(1 2 3)'' |
- | * '''(+ 1 3)'' | + | * '''(1 a 3.14)'' |
- | * Simbolul ''''' interpreteaza o lista ca **o structura de date**. Absenta acestuia, interpreteaza lista ca un program. Acest lucru se poate observa din exemplele anterioare. | + | * '''(+ 1 2)'' |
+ | * '''(1 (+ 3 4) 2)'' | ||
+ | |||
+ | * Exemple de programe: | ||
+ | * ''(+ 1 3)'' (= 4) | ||
+ | * ''(+ 1 (- 1 2))'' (= 0) | ||
+ | |||
* Simbolii ''`'' (quasiquote) si '','' (comma), se pot folosi in tandem pentru a crea combinatii de liste-program cu liste-structuri de date, ca in exemplul urmator: | * Simbolii ''`'' (quasiquote) si '','' (comma), se pot folosi in tandem pentru a crea combinatii de liste-program cu liste-structuri de date, ca in exemplul urmator: | ||
* ''`(1 ,(+ 2 3) 4)'' | * ''`(1 ,(+ 2 3) 4)'' | ||
Line 15: | Line 25: | ||
* Definitia unei variabile este o lista de forma: | * Definitia unei variabile este o lista de forma: | ||
* ''(define <var_name> <expr>)'' unde ''<var_name>'' si ''<expr>'' desemneaza un nume de variabila, respectiv expresie. De remarcat este ca ''<expr>'' este fie o variabila primitiva, fie o lista (date/program). | * ''(define <var_name> <expr>)'' unde ''<var_name>'' si ''<expr>'' desemneaza un nume de variabila, respectiv expresie. De remarcat este ca ''<expr>'' este fie o variabila primitiva, fie o lista (date/program). | ||
+ | * Setarea/schimbarea valorii unei variabile este o lista de forma: | ||
+ | * ''(set! <var_name> <expr>)'' unde ''<var_name>'' si ''<expr>'' au aceleasi semnificatie ca in cazul definirii unei variabile | ||
* **Exercitiu**: Scrieti un program in Scheme care verifica existenta efectelor laterale. | * **Exercitiu**: Scrieti un program in Scheme care verifica existenta efectelor laterale. | ||
Line 40: | Line 52: | ||
* **liste**: | * **liste**: | ||
* constructie (exemplu): ''(cons 1 '(2 3))'' | * constructie (exemplu): ''(cons 1 '(2 3))'' | ||
- | * explorare (exemple): ''(car '(1 2 3))'', ''(cdr '(1 2 3))'' | + | * explorare (exemple): ''(car '(1 2 3))'', ''(cdr '(1 2 3))'', ''(caar '(1 2 3))'', ''(cddr '(1 2 3))'' |
+ | * **Exercitiu**: definiti comportamentul functiilor de mai sus(+ bonus: cadr, cdar) | ||
+ | * lista vida (exemple): ''(empty? '(1 2 3))'' si ''(empty? '())'' | ||
+ | * egalitate: ''(eq? 1 2)'' | ||
* **conditionala** (if) este o lista de forma: | * **conditionala** (if) este o lista de forma: | ||
* ''(if <bool-expr> <expr1> <expr2>)'' unde ''<bool-expr>'' este un sub-program care se evalueaza la o valoare booleana (''#t'' (true), ''#f'' (false)), iar ''<expr1>'', ''<expr2>'' sunt expresii. | * ''(if <bool-expr> <expr1> <expr2>)'' unde ''<bool-expr>'' este un sub-program care se evalueaza la o valoare booleana (''#t'' (true), ''#f'' (false)), iar ''<expr1>'', ''<expr2>'' sunt expresii. | ||
Line 57: | Line 72: | ||
=== Warm-up === | === Warm-up === | ||
* Definiti o functie care determina factorialul unui numar | * Definiti o functie care determina factorialul unui numar | ||
+ | * Verificati daca o lista e palindrom | ||
=== Prelucrari de liste === | === Prelucrari de liste === | ||
Rezolvati urmatoarele exercitii (folosind, pe cat posibil, functii de ordin superior): | Rezolvati urmatoarele exercitii (folosind, pe cat posibil, functii de ordin superior): | ||
- | * Transformati o lista imbricata intr-o lista simpla. Exemplu: '''(1 (2 3 (4 5) 6) 7 (8 9))'' => '''(1 2 3 4 5 6 7 8 9)'' | + | * Transformati o lista imbricata intr-o lista simpla. |
+ | * Exemplu: '''(1 (2 3 (4 5) 6) 7 (8 9))'' => '''(1 2 3 4 5 6 7 8 9)'' | ||
+ | * Transformati o lista de elemente consecutive identice, in liste de liste, fiecare continand exact elementele identice. | ||
+ | * Exemplu: '''(1 1 1 1 1 2 2 2 3 4 5)'' => '''('' ''(1 1 1 1 1) (2 2 2) (3) (4) (5)'' '')''. | ||
+ | * Pentru o lista ce poate contine doar elemente consecutive identice, construiti o lista de ''<element,nr_aparitii>''. | ||
+ | * Exemplu: '''(1 1 1 1 1 2 2 2 3 4 5)'' => '''('' ''(1 4) (2 3) (3 1) (4 1) (5 1)'' '')''. | ||
+ | * Pentru o lista arbitrara, construiti o lista de elemente: ''<element,nr_aparitii>''. | ||
+ | * Exemplu: '''(1 2 3 1 4 2 2 5)'' => '''('' ''(1 2) (2 3) (3 1) (4 1) (5 1))'' '')''. | ||
+ | === Yawn === | ||
+ | * Implementati rotatia cu ''n'' pozitii la stanga/dreapta a unei liste: | ||
+ | * Exemplu: o rotatie de ''3'' pozitii la stanga pentru '''(1 2 3 4 5 6 7)'' produce '''(4 5 6 7 1 2 3)'' | ||
+ | ==== Download ==== | ||
+ | [[http://download.racket-lang.org/| DrRacket - Download]] |