IFT359 – Programmation fonctionnelle Thème #10 Évaluation par environnement et évaluateur méta-circulaire 1.

Slides:



Advertisements
Présentations similaires
Explorer un espace d’états
Advertisements

PL/SQL : Le Langage PL/SQL est une extension du SQL, qui offre
Les fonctions A quoi ça sert ?
Cours n° 7 Standard Template Library II.
Transformation de documents XML
Sensibilisation à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Hiver 2005Maj JGA Beaulieu & Capt MWP LeSauvage GEF 243B Programmation informatique appliquée Types, variables et constantes.
Approfondissement du langage
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
C.
Manipulation d’XML avec XSL
Calcul numérique (avec Maple)
Calcul numérique (avec Maple)
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
Points importants de la semaine Les commentaires. Les variables. Les instructions conditionnelles. Les instructions itératives (les boucles).
Semaine #1 INF155 par Frédérick Henri.
Un langage de programmation fonctionnelle
Structures de données linéaires
OCaml - Les listes L3 MI.
Analyse lexicale Généralités Expressions rationnelles Automates finis
Programmation fonctionnelle Le langage LISP
Standard Template Library (STL)
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Semaine #1 INF130 par Frédérick Henri.
Programmation fonctionnelle
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI3525: Concepts des Langages de Programmation Notes # 6: Langages de Programmation Fonctionelle II: Introduction au ML.
CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.
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.
Programmation logique Le Langage PROLOG
Procédures et fonctions
Animateur : Med HAIJOUBI
Chapitre III : Les Systèmes experts
CSI2520  cdr vers le bas, cons vers le haut (define (traite-liste L) (if (null? L) () (cons (traite (car L)) (traite-liste (cdr L)))))
Scripts shell intro Un script bash est un fichier contenant une suite de commandes shell, exécutables par l'interpréteur (ici le programme /bin/bash),
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
Créer des packages.
MIGO ET COMPLEXITE1 ARBRES EQUILIBRES Définition : On dit qu’un arbre binaire est H équilibré si en tout nœud de l’arbre, les hauteurs des sous-arbres.
 Syntaxe du langage PHP
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
Le langage Racket (Lisp)
Introduction au langage C Fonctions et Procédures
Sémantique des instructions pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
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.
Variables et environnement utilisateur W. Barhoumi.
Évaluation et application des fonctions Let f = function x -> ( function y -> x+y );; Type :int -> (int ->int) int -> int ->int f int.
CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
CSI2520 (map abs ‘( )) ( ) (map (lambda (x y) (* x y)) ‘( ) ‘( )) ( )  Permet d’appliquer une fonction aux.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
6/10/2005 © 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Récursion sur les Listes Peter Van Roy Département d’Ingénierie Informatique,
1 Cours 6 Définitions de nouvelles procédures Transmissions de données/résultats Déclarations globales/locales Visibilités Interface/implementation.
Introduction à l’utilitaire
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Chapitre 21 Collections partie III Set Une collection qui contient des éléments uniques. Deux implémentation :  HashSet : stock les éléments.
Algorithmique Algorithmique  Pascal
Directives Ocaml Définition
Philippe Gandy - 15 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
** Flash séance 2 Action script. ** Action Script Ajoute de l’interactivité Permet de contrôler les clips  Langage de programmation orienté objet.
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 exercice backquote, unquote, unquote-splicing 1.
IFT359 – Programmation fonctionnelle Thème 02 B partie A introduction au langage fonctionnel choisi 1.
Introduction à Clojure Jean-Sébastien A. Beaudry
Transcription de la présentation:

IFT359 – Programmation fonctionnelle Thème #10 Évaluation par environnement et évaluateur méta-circulaire 1

Évaluateur méta-circulaire Implémenter un DrRacket minimaliste à partir des primitives de DrRacket ! Ceci revient à implémenter la gestion des environnements –i.e. les applications de primitives se font directement à l’aide de apply On utilise les hash-tables (pour les mêmes raisons qu’au thème 6) –On pourrait utiliser set-mcar!, set-mcdr!

Les procédures repl et repl-print 3 (define repl-print (λ (x) (if (compound-procedure? x) (display (list 'procedure … )) (display x)))) (define repl (λ () (let ([input (read)]) (cond [(eq? input 'exit)(exit)] [(eq? input 'stop) …] [else (let ([output (eval input global-env)]) (repl-print output) (newline) (repl))]))))

Les procédures eval et read 4 '(λ (x) (+ x 2)) "bonjour " '(begin (+ 3 4)(λ (x) x)) (define eval (λ (exp env) (cond [(self-evaluating? exp) exp] [(variable? exp) (lookup-variable-value exp env)] … [(assignment? exp) (eval-assignment exp env)] [else (printf "expression inconnue :~a!\n" exp)]))) (read)  retourne une s-expression La procédure (eval s-exp) évalue l’expression Les expressions sont évaluées dans un environnement env sauf quoted et self-evaluating.

L’environnement global 5 (define global-env (extend-env primitive-procedure-names primitive-procedure-impls empty-env))

Les types d’expressions 6 (define eval (λ (exp env) (cond [(self-evaluating? exp) exp] [(variable? exp) (lookup-variable-value exp env)] …) (define self-evaluating? (λ (exp) (or (number? exp) (char? exp) (boolean? exp) (string? exp)))) Il existe toute une série de prédicat pour identifier le type d’expression « Est-ce que c’est un if, un begin … » (define quoted? (λ (exp) (tagged-list? exp 'quote))) La majorité des expressions sont des listes dont le premier élément définit le type de l’expression.

Les types d’expression 7 self-evaluating quoted assignment definition if and cond begin λ application Le TP5 vous demande d’ajouter le let et le or

Les environnements 8 (define empty-env 'empty-env) (define make-env (λ (env) (cons (make-hash) env))) (define bindings car) ; 1 ier environnement de la liste (define enclosing-env cdr) ; environnement parent (define global-env ; environnement global (extend-env primitive-procedure-names primitive-procedure-impls empty-env)) Les expressions sont évaluées dans un environnement. sauf les expressions de type self-evaluating? i.e. nombre, caractère, booléens et string. Les environnements sont encodées comme une liste de table de hachage.

Les environnements 9 (define lookup-variable-value (λ (var env) (cond [(eq? env empty-env) (printf "Variable non-définie '~a' !" var)] [(hash-has-key? (bindings env) var) (hash-ref (bindings env) var)] [else (lookup-variable-value var (enclosing-env env))]))) (define extend-env (λ (vars values env) (let ([new-env (make-env env)]) (for-each (λ (var-value) (define-variable! (car var-value) (cadr var-value) new-env)) (zip vars values)) new-env))) Les environnements sont modifiés par define, set!, let, et les applications.

Définition d’une nouvelle liaison avec define 10 (define eval-definition (λ (exp env) (define-variable! (definition-variable exp) (eval (definition-value exp) env) env))) (define define-variable! (λ (var value env) (if (hash-has-key? (bindings env) var) (printf "Variable ~a déja définie!\n" var) (hash-set! (bindings env) var value)))) (define eval (λ (exp env) (cond … [(definition? exp)(eval-definition exp env)] …) (define definition? (λ (exp) (tagged-list? exp 'define)))

L’affectation : set! 11 (define eval-assignment (λ (exp env) (set-variable-value! (assignment-variable exp) (eval (assignment-value exp) env) env))) (define set-variable-value! (λ (var value env) (cond [(eq? env empty-env) (printf "Variable non-définie ~a!" var)] [(hash-has-key? (bindings env) var) (hash-set! (bindings env) var value)] [else (set-variable-value! var value (enclosing-env env))]))) (define eval … (cond …[(assignment? exp) (eval-assignment exp env)] …) (define assignment? (λ (exp) (tagged-list? exp 'set!)))

L’affectation : begin 12 (define eval-sequence (λ (seq env) (cond [(null? (cdr seq)) (eval (car seq) env)] [else (eval (car seq) env) (eval-sequence (cdr seq) env)]))) (define eval … (cond … [(begin? exp) (eval-sequence (begin-actions exp) env)]…) (define begin? (λ (exp) (tagged-list? exp 'begin))) (define make-begin (λ (seq) (cons 'begin seq)))

Les formes syntaxiques : if et and 13 (define eval-and (λ (exp env) (let iter ([res #t] [reste (cdr exp)]) (if (null? reste) res (let ([val (eval (car reste) exp)]) (if val (iter val (cdr reste)) #f)))))) (define eval-if (λ (exp env) (if (eval (if-test exp) env) (eval (if-then exp) env) (eval (if-else exp) env))))

La forme syntaxique cond 14 (define cond->if (λ (exp) (expand-clauses (cond-clauses exp)))) (define expand-clauses (λ (clauses) (if (null? clauses) #f ;; patch il faudrait traiter (void) (let ([first (car clauses)] [rest (cdr clauses)]) (if (cond-else-clause? first) (if (null? rest) (sequence->exp (cond-actions first)) (printf "ELSE clause isn't last")) (make-if (cond-predicate first) (sequence->exp (cond-actions first)) (expand-clauses rest))))))) Exercice : Améliorer le code pour retourner void lorsqu’aucune clause est sélectionnée et pour traiter le cas où une clause ne contient qu’un élément.

La forme syntaxique cond 15 (define cond-clauses cdr) (define cond-predicate car) (define cond-actions cdr) (define cond-else-clause? (λ (clause) (eq? (cond-predicate clause) 'else))) (define make-if (λ (test then else) (list 'if test then else))) (define (sequence->exp seq) (cond [(null? seq) seq] [(null? (cdr seq)) (car seq)] [else (make-begin seq)])) (define make-begin (λ (seq) (cons 'begin seq)))

λ 16 (define λ? (λ (exp) (tagged-list? exp 'λ))) (define make-procedure (λ (parameters body env) (list 'procedure parameters body env))) (define eval (λ (exp env) (cond … [(λ? exp) (make-procedure (lambda-parameters exp) (lambda-body exp) env)] … )

Applications 17 (define application? (λ (exp) (and (list? exp) (not (null? exp))))) (define list-of-values (λ (exps env) (map (λ (e) (eval e env)) exps))) (define eval (λ (exp env) (cond … [(application? exp) (apply* (eval (operator exp) env) (list-of-values (operands exp) env))] … )

Applications 18 (define apply* (λ (procedure arguments) (cond [(primitive-procedure? procedure) (apply-primitive-procedure procedure arguments)] [(compound-procedure? procedure) (eval-sequence (procedure-body procedure) (extend-env (procedure-parameters procedure) arguments (procedure-env procedure)))] [else (printf "apply ne connait pas ~a!\n" procedure)])))

Primitives 19 (define apply* (λ (procedure arguments) (cond [(primitive-procedure? procedure) (apply-primitive-procedure procedure arguments)] …) (define apply-primitive-procedure (λ (pp args) (apply (primitive-implementation pp) args))) (define primitive-procedures (list (list '+ +) (list '- -) …)) (define primitive-procedure-names (map car primitive-procedures)) (define primitive-procedure-impls (map (λ (pp) (list 'primitive (cadr pp))) primitive-procedures))

eval du DrRacket eval prend un paramètre optionnel qui par défaut a la valeur de current-name-space et ce dernier est initialement vide dans un module Pour bien comprendre l’évaluation par environnement, on va définir notre propre fonction eval c’est ce qu’on appelle un évaluateur métacirculaire eval dans un module #lang racket (define ns (make-base-namespace)) (eval (+ 1 2) ns) eval évalue une s-expression, i.e. un atome ou une liste de symboles fait les phases suivant celle de la lecture, i.e. extension et évaluation. le quote ne fait que la phase de lecture ( eval '(+ 3 4)) -> 7 doit être fait dans la fenêtre d’interaction (REPL) eval est à éviter