CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.

Slides:



Advertisements
Présentations similaires
Prmt For imbriqués.
Advertisements

Objectif Trouver les facteurs dun nombre. Objective Find the factors of a number.
Premier programme en C :
Explorer un espace d’états
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
Chapitre annexe. Récursivité
Rappels C.
Les procédures et interruptions en Assembleur (Tasm)
Portée des variables VBA & Excel
Algorithmes et structures de données Cours 8
Algorithmes et structures de données Cours 10 Patrick Reuter
C++ 5ème cours Patrick Reuter maître de conférences
Sensibilisation à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
Programmation Tcl/Tk Raymond Ripp février 2010 Survol général o Applications et Protocoles o Windows Linux o Disques Processeurs o Passage en mode console.
Pour débutant … et autre Raymond Ripp
DECLARATION DE VARIABLES
Lire et écrire les valeurs de positions décimales Objectif.
QCA Unit 16 – Scène de Plage (part 3a – extended sentences) Jo Rhys-Jones - Kingswear Primary School 2008.
(Classes prédéfinies – API Java)
Gestion de FICHIERS.
Introduction à MPI Types dérivés MPI Décembre 2005
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
FLSI602 Génie Informatique et Réseaux
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
Un langage de programmation fonctionnelle
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
OCaml - Les listes L3 MI.
CYCLE 3 : Alternatives Faire des choix dans un programme en C 1- AIGUILLAGE SIMPLE sur CONDITION : if-else 2-AIGUILLAGE MULTIPLE sur CONDITIONS if-else.
44 Contrôle du déroulement du programme. 4-2 Objectifs A la fin de ce cours, vous serez capables de : Utiliser les constructions de prise de décision.
OCaml – Les arbres L3 MI.
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
Objets Javascript Mécanismes internes Le concept et la construction dobjets
Programmation fonctionnelle Le langage LISP
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Introduction à la programmation (Java)
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
??????????????????????? QUESTION WORDS Pensez!!! What words do we use in English to ask information questions???? Who What? When? Where? Why? How? How.
CSI2520, Hiver 2007 Le langage Pascal Un langage de programmation Impérative.
CSI2520, Hiver 2007 Python Un langage de programmation par scripting et plus…
IFT 6800 Atelier en Technologies d’information
Chapitre 9 Les sous-programmes.
Standard Template Library
CSI1502 Principes fondamentaux en conception des logiciels Chapter 8: Gestion des exceptions.
CSI2520 Ecriture sur l'écran ou dans un fichier Lecture à partir du clavier ou dun fichier Affichage de termes : *write(1+2) affiche 1+2 *write(X). affiche.
Animateur : Med HAIJOUBI
LANGAGE PASCAL Introduction rapide….
27/02/2006L3 MIAGE - GLO ADA1 Les Paquetages Permettent d’encapsuler un groupe d’entités logiquement reliées. Comme toute unité de programme, le paquetage.
Chapitre III : Les Systèmes experts
JavaScript Nécessaire Web.
LES PILES ET FILES.
CSI2520  cdr vers le bas, cons vers le haut (define (traite-liste L) (if (null? L) () (cons (traite (car L)) (traite-liste (cdr L)))))
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
Un survol du language C.
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
Variables et environnement utilisateur W. Barhoumi.
Cours LCS N°4 Présenté par Mr: LALLALI
CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
1 Système d’exploitation Les scripts csh 1 ère Année Année Tienté HSU.
CSI2520 (map abs ‘( )) ( ) (map (lambda (x y) (* x y)) ‘( ) ‘( )) ( )  Permet d’appliquer une fonction aux.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
Principes et variables
IFT359 – Programmation fonctionnelle Thème #6 Appel terminaux 1.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
IFT359 – Programmation fonctionnelle Thème #8 Création de nouvelles formes syntaxiques 1.
IFT359 – Programmation fonctionnelle Thème #10 Évaluation par environnement et évaluateur méta-circulaire 1.
Session 1 31 mai 2017 Plateforme ICONICS Justine Guégan
Transcription de la présentation:

CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle

CSI2520 read – retourne une entrée du clavier > (read) 234; entrée de lutilisateur 234; valeur retournee par la fonction > (read) "hello world" display – affiche son parametre sur ecran > (display "hello world") hello world > (display (+ 2 3)) 5 newline – affiche une nouvelle ligne Entrees / Sorties

CSI2520 Definir une fonction qui lit un nombre (si ce nest pas un nombre, elle continue de demander un nombre): > (define (ask-number) (display "Entrez un nombre: ") (let ((n (read))) (if (number? n) n (ask-number)))) > (ask-number) Entrez un nombre: a Entrez un nombre: (5 6) Entrez un nombre: mais pourquoi ?" Entrez un nombre: Entrees / Sorties

CSI2520 Une fonction qui lit un entier, fait appel a fact(ortielle) et affiche le resultat: (define (fact-interactive) (display "Entrez un entier: ") (let ((n (read))) (display La factorielle de ") (display n) (display " est ") (display (fact n)) (newline))) > (fact-interactive) Entrez un entier: 4 La factorielle de 4 est 24 Entrees / Sorties

Port dentrée CSI2520 (let ((p (open-input-file "myfile.ss"))) (let f ((x (read p))) (if (eof-object? x) (begin (close-input-port p) '()) (cons x (f (read p))))))

Appel avec un port dentrée CSI2520 (call-with-input-file "myfile.ss" (lambda (p) (let f ((x (read p))) (if (eof-object? x) '() (cons x (f (read p)))))))

Définition équivalente CSI2520 (define call-with-input-file (lambda (filename proc) (let ((p (open-input-file filename))) (let ((v (proc p))) (close-input-port p) v))))

Imprimer une liste CSI2520 (let ((p (open-output-file "myfile.ss"))) (let f ((ls list-to-be-printed)) (if (not (null? ls)) (begin (write (car ls) p) (newline p) (f (cdr ls))))) (close-output-port p))

Ou encore CSI2520 (call-with-output-file "myfile.ss" (lambda (p) (let f ((ls list-to-be-printed)) (if (not (null? ls)) (begin (write (car ls) p) (newline p) (f (cdr ls)))))))

Définition équivalente CSI2520 (define call-with-output-file (lambda (filename proc) (let ((p (open-output-file filename))) (let ((v (proc p))) (close-output-port p) v))))

CSI2520 Attribuer des valeurs à des variables avec set! Cette fonction permet dattribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le nom se termine par ! sont des fonctions qui modifient la valeur de l'un des arguments (opérations destructives).

CSI2520 Exemple (define light-switch (let ((lit #f)) (lambda () (set! lit (not lit)) (if lit 'on 'off)))) Encapsulation de la variable lit dans la définition de light-switch

Exemple impératif CSI2520 (define secondesImp (lambda (h m s) (let ((sh 0) (sm 0) (total 0)) (set! sh (* 60 (* 60 h))) (set! sm (* 60 m)) (set! total (+ s (+ sh sm))) total)))

Exemple plus fonctionnel CSI2520 (define secondes (lambda (h m s) (let ((sh (* 60 (* 60 h))) (sm (* 60 m)) ((+ s (+ sh sm))))))

CSI2520 (define PILE ()) (define (vide?) (null? PILE)) (define depiler (lambda () (let (( res (car PILE))) (set! PILE (cdr PILE)) res ))) (define empiler (lambda (element) (set! PILE (cons element PILE)))) (define (top) (vide? `()) (else (car PILE))) Pile en Scheme version impérative

CSI2520 Les vecteurs en Scheme sont des structures hétérogènes qui permettent daccéder aux différents éléments en utilisant un index. –Requière moins de mémoire –Les éléments sont accédés en temps constant Vecteurs en Scheme (make-vector k ) ; afin de créer un vecteur de k éléments (make-vector k init ) ; dont les éléments sont initialisés à init (vector? obj ) '#( element_0... element_k-1 ) ; afin de déclarer un vecteur constant Ex: '#(0 ( ) "Anna")

CSI2520 Constructeurs and accesseurs > (define v (vector 1 (+ 1 2))) #(1 3) > (vector a b c) #(a b c) > (vector-ref v 0) 1 > (vector-length v) 2 > (vector-set! v 3 10) 2 Lindex commence à 0. Vecteurs en Scheme

vector-set! CSI2520 (let ((v (vector 'a 'b 'c 'd 'e))) (vector-set! v 2 'x) v) #(a b x d e) (define vector-fill! (lambda (v x) (let ((n (vector-length v))) (do ((i 0 (+ i 1))) ((= i n)) (vector-set! v i x))))) (let ((v (vector 1 2 3))) (vector-fill! v 0) v) #(0 0 0)

conversion de listes à vecteurs CSI2520 (list->vector L) (vector->list L) (define vector->list (lambda (s) (do ((i (- (vector-length s) 1) (- i 1)) (ls '() (cons (vector-ref s i) ls))) (( list '#(a b c)) (a b c) (let ((v '#( ))) (apply * (vector->list v))) 120

Exemple CSI2520 (let ((v '#( ))) (let ((ls (vector->list v))) (list->vector (map * ls ls)))) #( )

CSI2520 Exemple (define vector-sum (lambda (vec) (let ((size (vector-length vec)) (position 0) (total 0)) (do () ((= position size) total) (set! total (+ total (vector-ref vec position))) (set! position (+ position 1)))))) (define vector-sum (lambda (vec) (do ((remaining (vector-length vec) (- remaining 1)) (total 0 (+ total (vector-ref vec (- remaining 1))))) ((zero? remaining) total))))

Tri des vecteurs et des listes CSI2520 (quick-sort '#( ) <) #( ) (merge-sort '( ) >) ( ) On doit avoir: (and (test x y) (test y x)) #f Voyons maintenant le tri fusion de listes…

Extraire une sous-liste CSI2520 (define (sub L start stop ctr) ; extract elements start to stop into a list (cond ( (null? L) L) ( (< ctr start) (sub (cdr L) start stop (+ ctr 1))) ( (> ctr stop) '() ) (else (cons (car L) (sub (cdr L) start stop (+ ctr 1))) ) ) )

Diviser une liste en deux CSI2520 (define (split L) ; split the list in half: ; returns ((first half)(second half)) (let ((len (length L))) (cond ((= len 0) (list L L) ) ((= len 1) (list L '() )) (else (list (sub L 1 (/ len 2) 1)(sub L (+(/ len 2)1) len 1) ) ) ) ) )

Fusion de 2 listes triées CSI2520 (define (mergelists L M) ; assume L and M are sorted lists (cond ( (null? L) M) ( (null? M) L) ( (< (car L)(car M)) (cons (car L) (mergelists (cdr L)M))) (else (cons (car M) (mergelists L (cdr M)))) ) )

Tri fusion CSI2520 (define (mergesort L) (cond ((null? L) '()) ((= 1 (length L)) L) ((= 2 (length L)) (mergelists (list (car L))(cdr L))) (else (mergelists (mergesort (car (split L)) ) (mergesort (car (cdr (split L))) ) )) ) )

quicksort CSI2520 (define (qsort e) (if (or (null? e) (<= (length e) 1)) e (let loop ((left null) (right null) (pivot (car e)) (rest (cdr e))) ; named let (if (null? rest) (append (append (qsort left) (list pivot)) (qsort right)) (if (<= (car rest) pivot) (loop (append left (list (car rest))) right pivot (cdr rest)) (loop left (append right (list (car rest))) pivot (cdr rest)))

CSI2520 Les arbres Un arbre binaire peut être représentée avec des listes imbriquées a / \ b c / \ d e (a b (c d e)) ou (a (b () ()) (c (d () ()) (e () ())) ou (a b.(c d.e))

arbre? CSI2520 (define tree? (lambda (t) (cond ((not (list? t)) #f) ((null? t) #t) ((not (= (length t) 3)) #f) ((not (tree? (cadr t))) #f) ((not (tree? (caddr t))) #f) (else #t) ) ) ) (tree? '(73 (31 (5 () ()) ()) (101 (83 () (97 () ())) ()))) (tree? '(73 (31 (5 () ()) ()) (101 (83 () (97 () () ())) ()))) (tree? '(73 (31 (5 () ()) ()) (101 (83 () (97 ())) ())))

Parcours inordre CSI2520 (define inorder (lambda (t) (define do-inorder (lambda (t) (if (null? t) () (append (inorder (cadr t)) (cons (car t) (do-inorder (caddr t)))) ) ) ) (if (not (tree? t)) (list 'not-a-tree t) (do-inorder t) ) ) ) (inorder '(73 (31 (5 () ()) ()) (101 (83 () (97 () ())) ())))

recherche CSI2520 (define search (lambda (x t) (define do-search (lambda (x t) (cond ((null? t) #f) ((equal? x (car t)) #t) ((precedes? x (car t)) (do-search x (cadr t))) ((precedes? (car t) x) (do-search x (caddr t))) (else #f) ) ) ) (if (not (tree? t)) (list 'not-a-tree t) (do-search x t) ) ) ) (define precedes? (lambda (x y) (< x y))) (search 83 '(73 (31 (5 () ()) ()) (101 (83 () (97 () ())) ()))) (search 84 '(73 (31 (5 () ()) ()) (101 (83 () (97 () ())) ())))

CSI2520 Recherche dans un arbre (define (tree-search tree value) (cond ((null? tree) #f) ((equal? value (car tree)) #t) ((< value (car tree)) (tree-search (cadr tree) value)) (else (tree-search (caddr tree) value)))) Au lieu de <, on pourrait utiliser precedent? (define precedent? (lambda (x y) (< x y)))

CSI2520 Insertion dans une liste (define (tree-insert tree value) (cond ((null? tree) (list value '() '())) ((< value (car tree)) (list (car tree) (tree-insert (cadr tree) value) (caddr tree))) (else (list (car tree) (cadr tree) (tree-insert (caddr tree) value)))))

Détruire un nœud de larbre CSI2520 (define delete (lambda (x t) (if (not (tree? t)) (list 'not-a-tree t) (do-delete x t) ) ) )

CSI2520 Détruire la racine dun arbre (define do-delete (lambda (x t) (cond ((null? t) ()) ((and (equal? x (car t)) (null? (cadr t))) (caddr t)) ((and (equal? x (car t)) (null? (caddr t))) (cadr t)) ((equal? x (car t)) (let ((r (removemax (cadr t)))) (list (cdr r) (car r) (caddr t)) )) ((precedes? x (car t)) (list (car t) (do-delete x (cadr t)) (caddr t))) ((precedes? (car t) x) (list (car t) (cadr t) (do-delete x (caddr t)))) (else t) ) ) )

CSI2520 Détruire un nœud de larbre (define removemax (lambda (t) (cond ((null? (caddr t)) (cons (cadr t) (car t))) (else (let ((r (removemax (caddr t)))) (cons (list (car t) (cadr t) (car r)) (cdr r)) )) ) ) )

CSI2520 Décompte du nombre déléments dans un arbre (define (nsymbols tree) (if (list? tree) (+ (nsymbols (car tree)) (nsymbols (cdr tree))) (if (symbol? tree) 1 0) ) ) > (nsymbols '(+ a (* b c))) 5 - Représentation sans les ( )

CSI2520 Avec récursivité terminale (define (nsymbols tree) (nsymbolsb tree 0)) (define (nsymbolsb tree n) (if (list? tree) (nsymbolsb (cdr tree) (nsymbolsb (car tree) n)) (+ n (if (symbol? tree) 1 0)) ) )

CSI2520 Darbre à liste (define (tree->list tree) (reverse (tree->list2 tree '()))) (define (tree->list2 tree lst) (if (list? tree) (tree->list2 (cdr tree) (tree->list2 (car tree) lst)) (if (null? tree) lst (cons tree lst) ) ) )

CSI2520 Évaluation différée Ou évaluation paresseuse, consiste à ne pas évaluer immédiatement une expression (delay exp) ; retourne une promesse dévaluation (force promesse) ; force lévaluation promise

CSI2520 Exemple (define (produit x y) (if (negative? x) (* x x) (* x (force y)))) (produit v (delay (sqrt v)))

CSI2520 Avec les listes Dans certains cas, il est possible dobtenir un résultat sans avoir à évaluer tous les éléments dune liste. (define (suite n1 n2 N) (if (zero? N) () (cons (+ n1 n2) (suite n2 (+ n1 n2) (- N 1))))) (suite ) ( )

CSI2520 Exemple sans delay (define (membre nbre L) (cond ((null? L) ()) ((< nbre (car L)) ()) ((= nbre (car L)) nbre) (#T (membre nbre (cdr L))))) (membre 15 (suite )) ; tous les éléments sont examinés! nil

CSI2520 Exemple avec delay (define (suite n1 n2 N) (if (zero? N) () (cons (+ n1 n2) (delay (suite n2 (+ n1 n2) (- N 1)))))) (define (membre nbre L) (let ((premier (car L))) (cond ((null? L) ()) ((< nbre premier) ()) ((= nbre premier) nbre) (#T (membre nbre (force (cdr L)))))))

Tours de Hanoi CSI2520 (define (dohanoi n to from using) (if (> n 0) (begin (dohanoi (- n 1) using from to) (display "move ") (display from) (display " --> ") (display to) (newline) (dohanoi (- n 1) to using from) ) ) (define (hanoi n) (dohanoi n 3 1 2) )

Tic Tac Toe CSI2520 (define start ((1 2 3) (4 5 6) (7 8 9) (1 4 7) (2 5 8) (3 6 9) (1 5 9) (3 5 7))) X joue: ((X 2 3) (4 5 6) (7 8 9) (X 4 7) (2 5 8) (3 6 9) (X 5 9) (3 5 7)) O joue: ((X 2 3) (4 5 6) (7 O 9) (X 4 7) (2 5 O) (3 6 9) (X 5 9) (3 5 7)) X O

Tic Tac Toe CSI2520 (define subst (lambda (new old l) (cond ((null? l) (quote ())) ((atom? (car l)) (cond ((eq? (car l) old) (cons new (subst new old (cdr l)))) (else (cons (car l) (subst new old (cdr l)))))) (else (cons (subst new old (car l)) (subst new old (cdr l))))))) La substitution:

Tic Tac Toe CSI2520 (define (all-equal? list) (cond ((null? list) `()) ((null? (cdr list)) (car list)) ((equal? (car list) (cadr list)) (all-equal? (cdr list))) (else #f))) Egalité de tous les éléments dune liste?

Tic Tac Toe CSI2520 (define (play board player position) (subst player position board)) (define (winner board) (map all-equal? board))

Tic Tac Toe CSI2520 (define (number-of-member x list) (cond ((null? list) 0) ((equal? x (car list)) (+ 1 (number-of-member x (cdr list)))) (else (number-of-member x (cdr list))))

Tic Tac Toe CSI2520 X XX OO (map (lambda (list) (number-of-member X list)) ((X 2 3) (4 X X) (7 O O) (X 4 7) (2 X O) (3 X O) (X X O) (3 X 7)))) ( )