Title: CSI3525: Concepts des Langages de Programmation
1CSI3525Concepts des Langages de Programmation
- Notes 5
- Langages de Programmation Fonctionelle I
Introduction au Scheme
2Introduction I
- Le paradigme de programmation fonctionelle est
base sur les fonctions mathematiques. - 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. - Les fonctions sont controllees par des appels
recursifs et des instructions conditionnelles
plutot que par des sequences dinstructions et
des repetitions iteratives. - De meme, une fonction calcule toujours le meme
resultat etant donne les memes arguments dentrée.
3Introduction II
- Les fonctions peuvent etre combinees de maniere
elegante et pratique. - 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. - Examples de formes fonctionelles les
compositions, les constructions et les
applications generalisees.
4Fondation des Langages de Programmation I
- Lobjectif de la programmation fonctionnelle est
dimiter le plus possible les fonctions
mathematiques. Ces langages sont donc tres
differents des langages imperatifs. - En particulier, un langage fonctionel pur
nutilise ni variables ni instruction
daffectement. Il utilise la recursion pour
obtenir de la repetition. - Les programmes sont des definitions de fonctions
et des specifications dapplications de
fonctions. - Les executions sont des evaluations
dapplications de fonctions.
5Fondation des Langages de Programmation II
- 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 - Bien que les langages fonctionnels soient souvent
implementes avec des interpreteurs, ils peuvent
aussi etre compiles.
6 Quelques examples en Scheme.
7Lisp en General
- Scheme (1975) represente lun des nombreux
dialectes du Lisp (originellement Lisp 1.5
(1975) plus recemment Common Lisp (1985)). - 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. - Example (A (B C) D (E (F G))) est parfaitement
valide. - On parle dun type different des types en
langages imperatifs.
8Syntaxe du Lisp et de ses descendants
- 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. - Cette uniformite dexpression donne aux langages
fonctionnels leur flexibilite et leur puissance
dexpression les programmes peuvent etre
manipules comme sils etaient des donnees!!
9Les 5 fonctions primitives du Lisp Pur 2 autres
operations essentielles
- Primitives
- cons --- pour construire une liste
- car --- pour trouver le premier element dune
liste. - cdr --- pour trouver la queue dune liste.
- eq -- pour verifier si deux atomes sont egaux.
- atom -- pour verifier si une entite est un atome.
- Operations Supplementaires Essentielles
- Evaluation dune expression
- 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.
10LUsage du Lisp et de ses Descendants I
- Comme Prolog et SmallTalk, Lisp est utilise
interactivement - Il ny a pas de programme principal
- 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 - 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.
11LUsage du Lisp et de ses Descendants II
- Les expressions sont, normallement, evaluees.
Afin deviter levaluation, il faut le demander
specifiquemen au Lisp en utilisant lexpression
quote ou . - 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.
12Revenons au Scheme Voici ses caracteristiques
- Le Scheme est un langage de tres petite taille
avec une syntaxe et semantique simple. - Il utilise levaluation a portee locale (ou
statique). Cela signifie que la portee (ou
visibilite) dune variable peut-etre determinee
avant lexecution du programme. gt La portee
dune variable est plus simple a determiner que
si elle doit etre determinee dynamiquement (comme
en Lisp 1.5). - Il traite les fonctions comme entites de premiere
classe, ce qui veut dire que les fonctions
peuvent- etre manipulees comme des donnees. - Les structures de donnees sont simples, uniformes
et versatiles et sappellent S-expressions (comme
en Lisp)
13Les Structures de Donnees
- Nombres entiers ou reels
- Variables
- un nom attache a un objet (define pi 3.14159)
- Le type dune variable est implicite et depend de
sa valeur. - Une variable peut recevoir une nouvelle valeur
(set! pi 3.141592)
(set! pi alpha) - Symboles un nom et rien quun nom pas de
valeur! - Listes (E1 E2En) ou Ei est une S-expression
14Les Fonctions Primitives I
- , -, , et / gt Notation Prefixe -- Ex ( 3 7)
- 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. - quote ou est la fonction qui evite levaluation
dexpressions. - car, cdr, cons, list (et aussi caaar, cddr,
cadaddadr, etc.)
15Les Fonctions Primitives II
- eq?, null?, list?
- , ltgt, gt, lt, gt, lt, even?, odd?, zero?, eqv?
- display, newline
- define
- (define (square x) ( x x)) ou
- (define squre (lambda (x) ( x x)))
- cond, if
- (cond ((equal? x 0) f) (if
(equal? x 0) ((gt x 5) 5) ltgt
f (else t))
t)
16Fonctions de haut niveau I (fonctions qui
peuvent etre des arguments)
- Example map
- map(f (E1 E2En))((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) )
--gt (2 3 4)
17Fonctions de haut niveau II (fonctions qui
peuvent etre des arguments)
- Les reducteurs
- 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))
--gt - (f E1 (f E2 (f (f
En f0) ))) - Examples (E1 E2 En) --gt E1 E2 En 0
- (E1 E2 En) --gt 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 ( 1 2 3 4) ) --gt 10
- (reduce 1 ( 1 2 3 4) ) --gt 24