CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme
Introduction I n Le paradigme de programmation fonctionelle est base sur les fonctions mathematiques. n Une fonction mathematique est une application qui va de lensemble de depart a lensemble darrivee. Elle prend un element de lensemble de depart et le transforme en un element de lensemble darrivee. n Les fonctions sont controllees par des appels recursifs et des instructions conditionnelles plutot que par des sequences dinstructions et des repetitions iteratives. n De meme, une fonction calcule toujours le meme resultat etant donne les memes arguments dentrée.
Introduction II n Les fonctions peuvent etre combinees de maniere elegante et pratique. n En particulier, on peut creer des fonctions dordre plus eleve--aussi appellees formes fonctionelles-- qui, ou bien prennent comme argument une autre fonction, ou bien retournent comme resultat une fonction. n Examples de formes fonctionelles: les compositions, les constructions et les applications generalisees.
Fondation des Langages de Programmation I n Lobjectif de la programmation fonctionnelle est dimiter le plus possible les fonctions mathematiques. Ces langages sont donc tres differents des langages imperatifs. n En particulier, un langage fonctionel pur nutilise ni variables ni instruction daffectement. Il utilise la recursion pour obtenir de la repetition. n Les programmes sont des definitions de fonctions et des specifications dapplications de fonctions. n Les executions sont des evaluations dapplications de fonctions.
Fondation des Langages de Programmation II n Un langage fonctionel doit avoir: – Un ensemble de fonctions primitives, – Un ensemble de formes fonctionnelles qui permettent de construire des fonctions complexes a partir de ces fonctions primitives, – Une operation dapplication de fonction, – Et, finallement, une ou plusieures structures de donnees n Bien que les langages fonctionnels soient souvent implementes avec des interpreteurs, ils peuvent aussi etre compiles.
Quelques examples en Scheme….
Lisp en General n Scheme (1975) represente lun des nombreux dialectes du Lisp (originellement: Lisp 1.5 (1975); plus recemment: Common Lisp (1985)). n Le Lisp 1.5 navait que deux types* de donnees: des atomes et des listes. Les atomes sont les symboles du Lisp. On peut avoir des listes de listes et une liste peut melanger les atomes et sous-listes de different degree sans probleme. n Example: (A (B C) D (E (F G))) est parfaitement valide. n * On parle dun type different des types en langages imperatifs.
Syntaxe du Lisp et de ses descendants n Les programmes et les donnees sont exprimes dans la meme syntaxe: – Applications de fonctions et structures conditionnelles sont ecrites sous la forme de listes, en parentheses en utilisant la forme prefix. – Programmes et donnees peuvent etre distingues par leurs contexte. n Cette uniformite dexpression donne aux langages fonctionnels leur flexibilite et leur puissance dexpression: les programmes peuvent etre manipules comme sils etaient des donnees!!
Les 5 fonctions primitives du Lisp Pur + 2 autres operations essentielles Primitives: n cons --- pour construire une liste n car --- pour trouver le premier element dune liste. n cdr --- pour trouver la queue dune liste. n eq -- pour verifier si deux atomes sont egaux. n atom -- pour verifier si une entite est un atome. Operations Supplementaires Essentielles: n Evaluation dune expression n Application dune fonction a des arguments (deja evalues) [Le Lisp 1.5 a aussi un certains nombre doperations auxilliaires pour gerer les listes darguments et les evaluations conditionnelles].
LUsage du Lisp et de ses Descendants I Comme Prolog et SmallTalk, Lisp est utilise interactivement: n Il ny a pas de programme principal n La boucle du niveau superieur evalue une expression (elle peut aussi faire du I/O). Cette expression, en revanche, peut invoqier une fonction qui implemente un algorithme long et complique n Un programme de Lisp consiste en une collection de fonctions qui peuvent etre appelees (directement ou indirectement) a partir de la boucle du niveau superieur.
LUsage du Lisp et de ses Descendants II n Les expressions sont, normallement, evaluees. Afin deviter levaluation, il faut le demander specifiquemen au Lisp en utilisant lexpression quote ou. n Les atomes sont traites literallement: ils sont ce quils sont et rien de plus: il se peut que latome ait une signification dans le domaine dapplication, mais le Lisp ne le sait pas.
Revenons au Scheme… Voici ses caracteristiques n Le Scheme est un langage de tres petite taille avec une syntaxe et semantique simple. n Il utilise levaluation a portee locale (ou statique). Cela signifie que la portee (ou visibilite) dune variable peut-etre determinee avant lexecution du programme. => La portee dune variable est plus simple a determiner que si elle doit etre determinee dynamiquement (comme en Lisp 1.5). n Il traite les fonctions comme entites de premiere classe, ce qui veut dire que les fonctions peuvent- etre manipulees comme des donnees. n Les structures de donnees sont simples, uniformes et versatiles et sappellent S-expressions (comme en Lisp)
Les Structures de Donnees n Nombres: entiers ou reels n Variables: – un nom attache a un objet (define pi ) – Le type dune variable est implicite et depend de sa valeur. – Une variable peut recevoir une nouvelle valeur: (set! pi ) (set! pi alpha) n Symboles: un nom et rien quun nom: pas de valeur! n Listes: (E1 E2…En) ou Ei est une S-expression
Les Fonctions Primitives I n +, -, *, et / => Notation Prefixe -- Ex: (+ 3 7) n EVAL est une fonction utilitaire appellee automatiquement a chaque etape de la boucle lecture-evaluation-ecriture de linterpreteur. Elle evalue, tout dabord, les parametres de la fonction, et ensuite, evalue la fonction appliquee a ces parametres. n quote ou est la fonction qui evite levaluation dexpressions. n car, cdr, cons, list (et aussi caaar, cddr, cadaddadr, etc.)
Les Fonctions Primitives II n eq?, null?, list? n =, <>, >, =, <=, even?, odd?, zero?, eqv? n display, newline n define – (define (square x) (* x x)) ou – (define squre (lambda (x) (* x x))) n cond, if (cond ((equal? x 0) #f) (if (equal? x 0) ((> x 5) 5) <> #f (else #t)) #t)
Fonctions de haut niveau I (fonctions qui peuvent etre des arguments) n Example: map n map(f (E1 E2…En))=((f E1) (f E2)…(f En)) ( define ( map f l ) ( if ( null? l ) l ( cons ( f ( car l ) ) ( map f ( cdr l) ) ) ) ) E.g.: (map (lambda (x) (+ x 1)) (1 2 3) ) --> (2 3 4)
Fonctions de haut niveau II (fonctions qui peuvent etre des arguments) Les reducteurs: n Etant donne une fonction binaire f et une constante f0, on veut definire la fonction de haut niveau telle que: (reduit f (E1 E2 … En)) --> (f E1 (f E2 (f … (f En f0) …))) Examples: (E1 E2 … En) --> E1 + E2 + … + En +0 (E1 E2 … En) --> E1 * E2 * … * En * 1 ( define (reduce f f0 1) ( if (null? l ) f0 (f (car l) (reduce f f0 (cdr l))) ) ) E.g.: (reduce + 0 ( ) ) --> 10 (reduce * 1 ( ) ) --> 24