User Tools

Site Tools


laboratoare:07-introducere-in-scheme

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

===== Laborator 7 - Introducere in Scheme ===== ==== Primitivele limbajului ==== === Structura unui program === * Elementul de baza pentru constructia de programe Scheme este **lista**. Un program este o **succesiune de liste**. Exemple: * '''(1 2 3)'' * '''(1 (2 3) 4)'' * '''(1 (+ 2 4) 5)'' * '''(+ 1 3)'' * Simbolul ''''' interpreteaza o lista ca **o structura de date**. Absenta acestuia, interpreteaza lista ca un program. Acest lucru se poate observa din exemplele anterioare. * 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)'' === Variabile === * 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). * **Exercitiu**: Scrieti un program in Scheme care verifica existenta efectelor laterale. === Functii si apeluri de functii === * O **functie anonima** este o lista de forma: * ''(lambda <p-list> <expr>)'' unde ''<p-list>'' este o lista de parametri formali ai functiei, iar ''<expr>'' este corpul functiei. * Exemplu: ''(lambda (x y) (+ x y))'' * Definitia unei functii se poate face: * definind o variabla care sa o desemneze: * Exemplu: ''(define f (lambda (x y) (+ x y)))'' * folosind o varianta prescurtata ''(define <f-list> <expr>)'', unde ''<f-list>'' desemneaza o lista al carui prim element este numele functiei, iar elementele urmatoare sunt parametrii functiei si ''<expr>'' desemneaza corpul functiei: * Exemplu: ''(define (f x y) (+ x y))'' * **Apelul** unei functii este o **lista** in care primul element este numele functiei, iar urmatorii sunt parametrii acesteia. * Exemplu: ''(f 1 2)'' * O functie ''f'' ce primeste ''n'' parametrii este in forma: * **curry**: daca este de forma: ''(lambda (x1) (lambda (x2) (... (lambda(xn) <expr>)...) * **uncurry**: daca este de forma: ''(lambda (x1 x2 ... xn) <expr>)'' * **Exercitii**: * Definiti si apelati adunarea in forma //curry//. * Implementati o functie care primeste un operator binar in forma //curry//, si intoarce operatorul in forma //uncurry//. * Implementati o functie care primeste un operator binar in forma //uncurry// si intoarce acelasi operator in forma //curry//. ==== Exercitii ====

laboratoare/07-introducere-in-scheme.1428324201.txt.gz · Last modified: 2015/04/06 15:43 by matei.popovici