CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session...

48
CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures de données composées Évaluation de fonctions Construction de listes et accès aux éléments Expressions fonctionnelles et définition de fonctions contrôle Fonctions de haut niveau

Transcript of CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session...

Page 1: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 1

Programmation fonctionnellePlan:LispUn Resumé du SchemeUne session Scheme

Scheme:Structures de données simplesStructures de données composéesÉvaluation de fonctionsConstruction de listes et accès aux élémentsExpressions fonctionnelles et définition de fonctionscontrôleFonctions de haut niveau

Page 2: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 2

Lisp

• La programmation fonctionnelle a commencé vers la fin des années 1950 (Veuillez relire la section 2.4). Plusieurs dialectes, Lisp 1.5 (1960), Scheme (1975), Common Lisp (1985)…[LISP = LISt Processor]

• [Il y a aussi d’autre langages fonctionnels: Hope, ML, Miranda, Haskell.]

• Plusieurs langages fonctionnels (dont Lisp) ont comme fondation mathématique le -calcul (lambda-calcul), un système qui permet aux fonctions d’être les valeurs d’une expression.

Page 3: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 3

Lisp (2)

• Mécanismes de control fondamentaux:

– Application de fonctions

– Composition de fonctions

– Instructions conditionnelles

– récursivité

• Les structures de données sont simples:

– listes,

– atomes (symboles et nombres).

Page 4: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 4

• Les programmes et données sont exprimés à l’aide de la même syntaxe:– L’application de fonctions et les instructions

conditionnelles sont écrites comme des listes, en parenthèse, avec le nom de l’instruction comme préfixe.

– Le programme et les données sont distinguées selon le contexte.

• Cette uniformité des données et du programme permettent une grande flexibilité et expressivité: – Les programmes peuvent être manipulés comme des

données.• Un interpréteur de LISP d’ une page en LISP a été à la base

de la première implémentation en bootstrapping d’un langage de programmation (une technique très puissante)

Lisp (3)

Page 5: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 5

5 fonctions primitives:

• cons — construit une liste,

• car — la tête d’une liste,

• cdr — la queue d’une liste,

• eq — Égalité d’atomes (Booléenne),

• atom — Vérifie si une atome (Booléenne);

• Deux autres opérations essentielles:

– L’évaluation d’expressions,

– Appliquer une fonction aux paramètres (déjà évalués)

Lisp (4)

Page 6: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 6

• Lisp est utilisé de façon interactive (comme Prolog):– Aucun programme principal,– L’interpréteur évalue les expressions et retourne leur

valeur (les expressions peuvent invoquer des fonctions très compliquées),

– Un programme Lisp est une collection de fonctions qui peuvent être invoquées directement ou indirectement par l’interpréteur.

– Toute expression est évaluée: Il faut dire explicitement à Lisp de ne pas évaluer quelque chose (avec quote)

• Un atome est traité littéralement: il n’est que lui même et n’a d’autre valeur que son nom.

Lisp (5)

Page 7: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 7

Lisp 1.5 à plusieurs points faibles:

• Syntaxe peu commode (mais élégante et uniforme).

• Règles à porté dynamique [Que nous verrons plus tard]

• Traitement inconsistant des fonctions en tant que paramètres (due à la porté dynamique).

Lisp (6)

Page 8: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 8

Un Resumé du Scheme

• Scheme est un sous-ensemble de Lisp.

• Il fait la distinction entre nombres et symboles

• La porté est lexicale (plutôt que dynamique)

• Corrige le problème du traitement des paramètres(grâce à la porté lexicale):

– Les fonctions sont des objets de première classe, c’est à dire qu’elles peuvent être créées, assignées à des variables, passées comme paramètres, retournées comme valeurs.

• Les structures de données, en Scheme sont simples, uniformes et versatiles. Comme pour Lisp 1.5, on les appelles S-expressions.

Page 9: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 9

Le system Scheme pour ce cours

Veuillez vous connecter (via ssh) a site1, et taper scm au prompt.

% scmSCM version 5d3, Copyright (C) 1990-1999 Free Software Foundation.SCM comes with ABSOLUTELY NO WARRANTY; for details type `(terms)'.This is free software, and you are welcome to redistribute itunder certain conditions; type `(terms)' for details.;loading /usr/local/lib/slib/require;done loading /usr/local/lib/slib/require.scm;loading /usr/local/lib/scm/Transcen;done loading /usr/local/lib/scm/Transcen.scm;Evaluation took 50 mSec (0 in gc) 15992 cells work, 4000 env, 17604 bytes other>

A ce moment la, vous êtes en dialogue avec la boucle interactive supérieure. Vous pouvez, par example, taper (terms) ou (exit) ou (quit) ou vous pouvez continuer…

Page 10: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 10

Une session Scheme% scm > ( cons 'alpha '( beta ) )(alpha beta) > ( symbol? 'alpha )#t > ( symbol? '( alpha ) )#f

Page 11: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 11

> ( null? 'alpha )#f > ( null? () )#t

> ( number? 'alpha )#f

> ( number? 23 )#t

> ( symbol? alpha )ERROR: unbound variable: alpha; in expression: (... alpha); in top level environment. 

Une session Scheme(2)

Page 12: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 12

> ( define alpha 5 )

#<unspecified>

> ( number? alpha )

#t

> ( symbol? alpha )

#f

> ( cdr ( cons 'x '( y z ) ) )

(y z)

> ( cons 'x ( cdr '( y z ) ) )

(x z)

> ( + 1 2 )

3

Une session Scheme (3)

Page 13: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 13

> ( define ( addOne x ) ( + x 1 ) )#<unspecified>> ( addOne ( addOne 15 ) )17

> ( define ( myAnd x y ) ( if x y #f ) )#<unspecified>> ( myAnd ( symbol? '(a) ) ( eq? 'a 'a ) )#f> ( and ( symbol? '(a) ) ( eq? 'a 'a ) )#f

Une session Scheme(4)

Page 14: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 14

> ( define ( myOr x y ) ( if x #t y ) )#<unspecified>> ( myOr ( symbol? '(a) ) ( eq? 'a 'a ) )#t> ( or ( symbol? '(a) ) ( eq? 'a 'a ) )#t

 > ( eq? 'a 'a )#t> ( eq? 'a 'b )#f> ( eq? '( a ) '( a ) )#f

Une session Scheme(5)

Page 15: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 15

>( define ( numberList? x ) ( if ( not ( list? x ) ) #f ( if ( null? x ) #t ( if ( not ( number? ( car x ) ) ) #f ( numberList? ( cdr x )) ) ) ) )#<unspecified>> ( numberList? ' ( 1 2 3 4 ) )#t

Une session Scheme(6)

Page 16: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 16

>( define ( numberList? x ) ( cond ( ( not ( list? x ) ) #f ) ( ( null? x ) #t ) ( ( not ( number? ( car x ) ) ) #f ) ( else ( numberList? ( cdr x ) ) )) )> ( numberList? ' ( 1 2 3 4 ) )#t> ( numberList? ' ( 1 2 3 bad 4 ) )#f

Une session Scheme (7)

Page 17: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 17

>( define ( eqExpr? x y ) ( cond ( ( symbol? x ) ( eq? x y ) ) ( ( number? x ) ( eq? x y ) ) ; x must be a list now: ( ( null? x ) ( null? y ) ) ; x must be a non-empty list now: ( ( null? y ) #f ) ( ( eqExpr? ( car x ) ( car y ) ) ( eqExpr? ( cdr x ) ( cdr y ) ) ) ( else #f )) )

> ( eqExpr? '( a b ( c d ) ) '( a b ( c d ) ) )#t> ( eqExpr? '( a b ( c d ) ) '( a b ( c d e) ) )#f

Une session Scheme (8)

Page 18: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 18

> ( define ( member? K L ) ( cond ( (null? L ) #f ) ( ( eqExpr? K ( car L ) ) #t ) ( else ( member? K ( cdr L ) ) )) )#<unspecified>

> ( member? 'aa '( bb cc aa ee rr tt ) )#t > ( member? 'aa '( bb cc (aa) ee rr tt ) )#f

Une session Scheme (9)

Page 19: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 19

> ( define ( append L1 L2 ) ; built-in! (if ( null? L1 ) L2 ( cons ( car L1 ) ( append ( cdr L1 ) L2 ) ) ) )WARNING: redefining built-in append#<unspecified> > ( append '( ab bc cd ) '( de ef fg gh ) )(ab bc cd de ef fg gh) > ( exit );EXIT

Une session Scheme (10)

Page 20: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 20

Structures de données simples

• Nombres: entiers ou floats.

• Une variable est un nom lié à une donnée, par exemple:

(define pi 3.14159)

• Une variable a un type implicite, dépendant de sa valeur. Elle peut prendre une valeur d’un autre type:

(set! pi 3.141592)

(set! pi 'alpha)

(set! pi (cons pi '(rho)))

• Un symbole est un nom n’ayant d’autre valeur que lui même.

Page 21: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 21

Structures de données composées

Le format générale d’une liste:

(E1 E2 ...... En) où Ei est une S-expression.

Dépendamment du contexte, une liste peut être traité littéralement (comme une donnée):

((William Shakespeare) (The Tempest))

ou comme une application de fonction avec les paramètres passés par valeur:

(append x y)

Page 22: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 22

Une liste (E1 E2 ...... En) est produite par cons:

(cons E1 (cons E2 ... (cons En ()) ... ))

produit:

(E1 . (E2 ... (En . ( )) ... ))

On a aussi les paires ‘pointées’, peu utilisées en pratique:

cons( ) produit: ( . )

Structures de données composées (2)

Page 23: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 23

Évaluation de fonctions

• Avec: une liste (E0 E1 ... En)

• Étape 1

Évalue E0 pour obtenir V0,

Évalue E1 pour obtenir V1,

......,

Évalue En pour obtenir Vn.

V0 doit être une fonction,

V1, ..., Vn sont des données.

• Étape 2

Applique V0 à V1, ..., Vn

C’est à dire, calcule V0(V1, ..., Vn).

Page 24: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 24

• L’évaluation est bloquée par quote:

(quote pi) ou de façon équivalente: 'pi

• Si pi est défini ainsi:

(define pi 3.141592)

• Exemples:

(* 2.0 pi) retourne 6.283184

(* 2.0 'pi) paramètre invalide

('* 2.0 'pi) fonction invalide

(write 'pi) affiche le symbole pi

(write pi) affiche 3.141592

Quote

Page 25: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 25

Construction de listes et accès aux éléments

• Les listes sont définies récursivement:

Une liste vide: (),

Une liste non-vide: (cons )

où is a list.

• La tête et la queue d’une liste:

(car (cons )) retourne

(cdr (cons )) retourne

(car ()) et (cdr ()): paramètre invalide

Page 26: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 26

Une convention de notation pour accéder aux autres éléments de la liste:

(caar x) (car (car x))(cdadr x) (cdr (car (cdr x))))

Par exemple, l’évaluation suivante se fait en 4 étapes:(caadar '((p ((q r) s) u) (v)))(caadr '(p ((q r) s) u))(caar '(((q r) s) u))(car '((q r) s))'(q r)

Le deuxième élément d’une liste x — si il existe:(cadr x)

Le troisième, quatrième, ... : (caddr x), (cadddr x), ...

Accès aux éléments

Page 27: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 27

• car, cdr, cons sont les fonctions primitives qui permettent l’accès aux listes. Trois autres sont des prédicats: des fonctions qui retournent #t ou #f.

• (symbol? x)

#t ssi x est un symbole symboles,

• (number? x)

– ssi x est un nombre,

• (eq? x y)

– ssi x et y sont des symboles et sont égaux.

Fonctions primitives

Page 28: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 28

Autre fonctions(elle peuvent être définie à partir des primitives):

(equal? x y) vrai ssi x et y sont des objets identiques (pas nécessairement atomique)

(null? x) si x est () – la liste vide.

(append x y) concatène les listes x et y.

Autre fonctions

Page 29: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 29

Une définition lie l’expression d’une fonction à un nom:

(define (square x) (* x x))

ou, de façon équivalente:

(define square

(lambda (x) (* x x)))

Le nom d’une fonction peut être évaluée:

> square

#<CLOSURE (x) #@lambda (* x x)>

Les fonctions n’ont pas nécessairement de nom!

> ((lambda (x) (* x x x)) 3)

27

Définir des fonctions

Page 30: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 30

Les structures de contrôle en Scheme, comme en Lisp, sont simple. Il n’existe pas de boucles. Il y a l’application de fonctions, l’expression conditionnelle, et la séquence (une concession aux programmeurs habitués aux langages impératifs):

> (begin (print 'okay) (print '(great)))okay(great);Evaluation took [...](great)

La valeur retournée par (begin ...) est la valeur du dernier terme.

Contrôle

Page 31: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 31

 Instructions conditionnelles

(cond (C1 E1)

(C2 E2) ......

(Cn En)

(else En+1))

• La dernière partie, (else En+1), est optionnelle.

• (Ci Ei) représente une paire condition-expression. Les pairs sont évaluées de gauche à droite. On arrête quand on trouve un Ci qui est vrai (qui retourne #t ). On retourne le Ei correspondant.

• else est évalué comme #t.

Page 32: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 32

Cas spécial: if

(cond (C1 E1) (else E2))

Peut être abrégé:

(if C1 E1 E2)

Page 33: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 33

D’autre exemples de fonctions

(define (same_neighbours? l)

(cond

((null? l) #f)

((null? (cdr l)) #f)

((equal? (car l)(cadr l)) #t)

(else

(same_neighbours? (cdr l)))

) )

Page 34: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 34

Pile en Scheme

(define (empty? stack)

(null? stack)

(define (pop stack)

(if (empty? stack)

stack

(cdr stack)

) )

(define (push el stack)

(cons el stack)

)

(define (top stack)

(if (empty? stack)

()

(car stack)

) )

Page 35: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 35

Minimum d’une liste(define (minL Lst)

(if (null? Lst)

Lst

(minL-aux (car Lst)(cdr Lst))

) )

(define (minL-aux Elt Lst)

(cond

((null? Lst) Elt)

((> Elt (car Lst))

(minL-aux (car Lst)(cdr Lst)))

(else (minL-aux Elt (cdr Lst)))

) )

Page 36: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 36

(define (minL-aux Elt Lst) (if (null? Lst) Elt (let ((carl (car Lst)) (cdrl (cdr Lst))) (if (> Elt carl) (minl-aux carl cdrl) (minl-aux Elt cdrl)) ) ) )

Minimum d’une liste, une variante a porte locale

Page 37: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 37

>(define (quadruple x) (let ((double (lambda (x) (+ x x)))) (double (double x))) )#<unspecified>> (quadruple 8)32> (double 8)

unbound variable: double; in expression: (... double 8); in top level environment.

Un autre exemple de portée locale

Page 38: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 38

> (define (quadruple x) (define (double x) (+ x x)) (double (double x)))#<unspecified>> (quadruple 8)32> (double 8)

unbound variable: double; in expression: (... double 8); in top level environment.

Un autre exemple de portée locale (2)

Page 39: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 39

Fonctions de haut-niveau

Certaine fonctions prennent des fonctions comme paramètres.> (define (combine Fun1 Fun2 X) (Fun1 (Fun2 X)) )> (combine (lambda (x) (+ 1 x)) (lambda (x) (* 2 x)) 6)> (combine (lambda (x) (* 2 x)) (lambda (x) (+ 1 x)) 6)Équivalent à:> ((lambda (x) (+ 1 x)) ((lambda (x) (* 2 x)) 6))> ((lambda (x) (* 2 x)) ((lambda (x) (+ 1 x)) 6))

Page 40: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 40

(define (map F Lst) (if (null? Lst) Lst (cons (F (car Lst)) (map F (cdr Lst)))) )

Fonctions de haut-niveau (2)

Un exemple classique: map, l’opération qui applique une fonction aux éléments d’une liste:

(E1 E2 ...... En) ((f E1) (f E2) ...... (f En))

Par exemple (map (lambda(x) (+ x 1)) '(1 2 3))

retourne: (2 3 4)

Page 41: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 41

Une version de map qui applique la fonction à chaque éléments sans retourner la liste résultante:

Fonctions de haut-niveau (3)

(define (do-for-all F L)

(if (null? L)

L

(let ((dummy (F (car L))))

(do-for-all F (cdr L))

) ) )

Par exemple:

(do-for-all write '(1 2 3))

Page 42: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 42

Voici un petit exercice:

(define (f) (lambda (x) (+ 1 x)))

Quelle est la valeur de cette fonction?

Fonctions de haut-niveau (4)

Page 43: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 43

Réducteurs

Soit F une opération binaire, c’est à dire, à deux paramètres. Soit F0 une constante. On veut exprimer la

transformation suivante:

(E1 E2 ...... En)

(F E1 (F E2 (F ...... (F En F0) ...... )))

Qui s’exprime plus facilement avec une notation infixe:

(E1 E2 ...... En) E1 F E2 F ...... F En F F0

Page 44: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 44

Example:

(E1 E2 ...... En) E1 + E2 + ...... + En + 0

(E1 E2 ...... En) E1 * E2 * ...... * En * 1

Reducteurs (2)

(define (reduce F F0 L)

(if (null? L)

F0

(F (car L)

(reduce F F0 (cdr L)))

) )

Page 45: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 45

> (reduce + 0 '(1 2 3 4))

> (reduce * 1 '(1 2 3 4))

> (reduce (lambda (x y) (+ x y 1)) 8 '(1 2 3))

> (reduce cons () '(1 2 3 4))

> (reduce append () '((1) (2) (3)))

Reducers (3)

Page 46: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 46

Noms pre-determines

Manipulation de listecarcdrconsappendlistlengthcaar, cadr, cdar, cddr, ..., caaaar, ..., cddddr

Pour définir definelambda

Page 47: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 47

Logiquenot and or #t #f

Contrôleifcondelseletbegin

Arithmétique et comparaison + < - > * <= / >= max = min

Noms pré-determinés (2)

Page 48: CSI 3125, Scheme, page 1 Programmation fonctionnelle Plan: Lisp Un Resumé du Scheme Une session Scheme Scheme: Structures de données simples Structures.

CSI 3125, Scheme, page 48

Prédicatssymbol? number? integer? real? list? null? eq? equal? procedure?

fonctions I/O write display printreadDiversloadmapquoteset!

Noms pré-déterminés (3)