BABYL OPTIONS: -*- rmail -*- Version: 5 Labels: Note: This is the header of an rmail file. Note: If you are seeing it in rmail, Note: it means the file has no messages in it.  1,, X-Coding-System: nil Mail-from: From bertin@enserb.fr Wed Feb 28 21:07 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id VAA22988 for ; Wed, 28 Feb 2001 21:07:13 +0100 (MET) Received: from enserb.fr (bertin@camus [147.210.19.60]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id VAA27295 for ; Wed, 28 Feb 2001 21:01:36 +0100 (MET) Sender: bertin@enseirb.fr Message-ID: <3A9D597D.82CA2D3F@enserb.fr> Date: Wed, 28 Feb 2001 21:03:11 +0100 From: BERTIN Guillaume X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Exam Content-Type: multipart/mixed; boundary="------------98026CE15C0633B3C302FB21" Content-Length: 2306 *** EOOH *** Sender: bertin@enseirb.fr Date: Wed, 28 Feb 2001 21:03:11 +0100 From: BERTIN Guillaume X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Exam Content-Type: multipart/mixed; boundary="------------98026CE15C0633B3C302FB21" Content-Length: 2306 This is a multi-part message in MIME format. --------------98026CE15C0633B3C302FB21 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------98026CE15C0633B3C302FB21 Content-Type: text/plain; charset=iso-8859-1; name="exam.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.lisp" ; Bertin Guillaume I3 ;Exercice 1 (defmacro with-buffering (window &body body) ; stockage de la variable window dans une variable temporaire (let ((save (gensym))) `(let ((,save ,window)) ; le progn permet d'exécuter une liste d'instructions (progn ; creation du pixmap (setf (,window (create-pixmap ,window)) ; Si toutes les operations se déroulent bien alors on écrase la valeur sauvegardée par le pixmap resultant (if (and ,@body) (copy-pixmap ,window ,save)) ; destruction du pixmap et recupération de la valeur de la window ( si succès des operations alors nouvelle valeur sinon ancienne valeur) (destroy-pixmap ,window) (setf ,window ,save) ))))) ; On a consideré l'hypothèse suivante ; Les opérations sont des fonctions qui renvoient le booléen true si et seulement si elles se sont bien deroulées. ; Exercice 2 ; L'objectif est que l'interpréteur lisp évalue directement des expressions du type: ; (select * from table) ; On suppose que l'on peut instancier une variable globale du type *connectDB* (defmacro connectDB(DB) `(setf *connectDB* ,DB)) ; Si l'utilisateur dispose d'une macro du type connect_DB(DB) qui réalise le setf correspondant alors ce dernier passe en mode pseudo-connectée. ; C'est à dire que s'il passe desormais une instruction du type (select * from table) alors il exécute une macro select(&body body) permettant de lancer l'instruction SQL constituée par un cons de select et de l'ensemble du body. ; (defmacro select(&body body) (if (*DB*) (`(let ((SQL (cons 'select ,body ))) (progn (executeSQL SQL *buffer*) ...))))) ; On peut envisager de stocker les résultats dans un *buffer* puis d'implémenter des macros permettant déffectuer des opérations de lecture. ; Pour passer en mode déconnecté, il suffit d'implémenter une macro deconnectDB() permettant de mettre *connectDB* à NIL. --------------98026CE15C0633B3C302FB21--  1,, X-Coding-System: nil Mail-from: From bocande@enseirb.fr Wed Feb 28 21:52 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id VAA24392 for ; Wed, 28 Feb 2001 21:52:51 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id VAA02905; Wed, 28 Feb 2001 21:47:14 +0100 (MET) Received: from enseirb.fr (bocande@localhost [127.0.0.1]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id VAA07820; Wed, 28 Feb 2001 21:47:47 +0100 (MET) Sender: bocande@enseirb.fr Message-ID: <3A9D63F3.1854DCDF@enseirb.fr> Date: Wed, 28 Feb 2001 21:47:47 +0100 From: Bertrand X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: fr, en MIME-Version: 1.0 To: "strandh@labri.u-bordeaux.fr" Subject: Examen langages enchasses Content-Type: multipart/mixed; boundary="------------17839404DD33F4F9E48F208F" Content-Length: 2843 *** EOOH *** Sender: bocande@enseirb.fr Date: Wed, 28 Feb 2001 21:47:47 +0100 From: Bertrand X-Accept-Language: fr, en To: "strandh@labri.u-bordeaux.fr" Subject: Examen langages enchasses Content-Type: multipart/mixed; boundary="------------17839404DD33F4F9E48F208F" Content-Length: 2843 This is a multi-part message in MIME format. --------------17839404DD33F4F9E48F208F Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Monsieur, Veuillez trouver ci-joint mon travail. Cordialement, Bertrand Bocande. --------------17839404DD33F4F9E48F208F Content-Type: text/plain; charset=us-ascii; name="Examen.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Examen.lisp" ; Bocande Bertrand ;################# ; Exercice 1 ;################# (defmacro with-buffering (window &body body) ; stockage de la variable window dans une variable temporaire afin de la restaurer en cas d'erreur (let ((save (gensym))) `(let ((,save ,window)) (progn (setf (,window (create-pixmap ,window)) ; On desire pouvoir restaurer la fenetre si une ; operation graphique provoque une erreur: on ; utilise un 'and' sur ces operations. Ainsi, ; si l'une de ces operations se deroule mal, ; on restaure la valeur initiale de la fenetre. (if (and ,@body) (copy-pixmap ,window ,save)) (destroy-pixmap ,window) (setf ,window ,save) ))))) ; Pour cette macro, on a considere que les operations graphiques sont des procedures qui modifient l'environnement (en l'occurence la variable window). Cependant, si chaque operation graphique renvoyait une fenetre, on pourrait envisager d'ecrire une macro anaphorique.On l'utiliserait de la maniere suivante: ; (with-buffering *window* ; (graphics-op-1 it ...) ; ... ; (graphics-op-n it ...)) ;################# ; Exercice 2 ;################# ; On suppose que l'on se trouve dans un environnement dans lequel existe une variable globale *db* representant la base en cours d'utilisation ; De plus, nous avons a notre disposition des primitives permettant de se connecter, des se deconnecter d'envoyer une requete SQL et de recuperer les reponses. ; Ces requetes seraient du type (db-connect db ...) (db-disconnect db ...) (db-query sql-query id ...) et (db-result id ...). ; Les ... traduisent le fait que l'on suppose que d'autres parametres peuvent etre pris en compte sans que nous nous en occupions pour le moment. Quant a id, il permet de savoir a quelle requete correspond telle reponse... (on suppose la possibilite d'acces concurrents) ; Nous voulons maintenant qu'un utilisateur puisse depuis un environnement Lisp ecrire des requetes SQL de maniere transparente. (defmacro set-db (db) `(setf *db* ,db)) (defmacro select (&body args) `(progn (db-connect *db*) (db-query (cons 'select ,args) id) (format nil ,(db-result id)) (db-disconnect *db*))) ; Exemple d'utilisation: * (set-db mushrooms) ; on utilise la base mushrooms * (select name from DNA_Sequences where country = 'france') --------------17839404DD33F4F9E48F208F--  1,, X-Coding-System: nil Mail-from: From ayeb@enserb.fr Thu Mar 1 04:35 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id EAA04709 for ; Thu, 1 Mar 2001 04:35:16 +0100 (MET) Received: from spendius.enseirb.fr (root@spendius [147.210.18.14]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id EAA16599; Thu, 1 Mar 2001 04:29:40 +0100 (MET) Received: from spendius (ayeb@localhost [127.0.0.1]) by spendius.enseirb.fr (8.9.3/8.9.3) with SMTP id EAA22489; Thu, 1 Mar 2001 04:31:44 +0100 (MET) Sender: ayeb@enseirb.fr Message-ID: <3A9DC29F.3855@enserb.fr> Date: Thu, 01 Mar 2001 04:31:43 +0100 From: ayeb jelloul X-Mailer: Mozilla 3.01Gold (X11; I; SunOS 5.7 sun4u) MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr CC: ayeb@enseirb.fr Subject: examen LE (fichier lisp) Content-Type: multipart/mixed; boundary="------------120266B7462B" Content-Length: 4056 *** EOOH *** Sender: ayeb@enseirb.fr Date: Thu, 01 Mar 2001 04:31:43 +0100 From: ayeb jelloul To: strandh@labri.u-bordeaux.fr CC: ayeb@enseirb.fr Subject: examen LE (fichier lisp) Content-Type: multipart/mixed; boundary="------------120266B7462B" Content-Length: 4056 This is a multi-part message in MIME format. --------------120266B7462B Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Bonjour , voici ma "copie" pour l'examen de langages enchasses. C'est un ficheir LISP. Il était à rendre pour jeudi avant midi. salutations, AYEB JELLOUL --------------120266B7462B Content-Type: text/plain; charset=iso-8859-1; name="examenLeAYEBjelloul.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="examenLeAYEBjelloul.lisp" ;;;QUESTION N1;;; ;;;;;;;;;;;;;;;;; ;;;POUR LES TESTS: ;;;fonction préexistante create-pixmap: (defun create-pixmap (fenetre) (print "pixmap de la taille de fenetre crée") ) ;;;fonction préexistante de copy de pixmap: (defun copy-pixmap (pixmap fenetre) (print "pixmap copié dans fenetre") ) ;;;fonction preexistante de destruction de pixmap: (defun destroy-pixmap (pixmap) (print "pixmap detruit") ) ;;;macro with-buffering: (defmacro with-buffering (window &operations operations) (let ( (workwindow (gensym)) ;;;nouvelle fenetre (savewindow (gensym)) ) ;;;sauvegarde de l'ancienne `(let ((,savewindow ,window)) (setf ,window (create-pixmap ,window)) (progn ,@operations) (copy-pixmap ,window ,workwindow) (destroy-pixmap ,window) (setf (,window ,savewindow)) ;;;valeur passée en para. sauvée ,workwindow))) ;;;QUESTION N2;;; ;;;;;;;;;;;;;;;;; ;;; On désire créer un langage enchâssé dans LISP pour SQL. ;;; On doit donc implémenter les requêtes de base de SQL: ;;; - TABLE : création,suppression,modification (INSERT, DELETE,UPDATE) ;;; - VUE : création,suppression ;;; - DATABASE: création,utilisation (choix de telle base), suppression ;;; - OPERATIONS: SELECT , JOIN, COUNT, ORDER, UNIQUE,... ;;; - ODBC: connexion et deconnexion à une base (on suppose déjà implémenté) ;;; ;;; De plus on veut que le lanbgage soit "transparent", c-à-d naturel pour un ;;; programmeur LISP.Donc des examples d'utilisation seront comme suit: ;;; -TABLE: ;;; création: (create-table [eleves] ;;; '(([id] (char 10) unique) ([nom] (char 8)))) ;;; suppression: (drop-table [eleves] ) ;;; modification: INSERT: (insert :into [eleves] ;;; :values '( 1 "ayeb")) ;;; UPDATE:(update [eleves] (setf [nom] "Gl") :where (= [id] 1)) ;;; DELETE: (delete :from [eleves] :where (= [id] 1)) ;;; SELECT: (select [id] :from [eleves] :where (= [nom] "ayeb")) ;;; -VUE: création: (create-view [login] :as (select ... :count-on [id])) ;;; suppression: (drop-view [login]) ;;; -DATABASE: création: (create-database myDatabase) ;;; suppression: (drop-database myDatabase) ;;; choix d'une base:(use-database [myDatabase]) ;;; ;;; Problèmes d'environnement: en SQL, il y a des problèmes de ROLLBACK, on ;;; peut souhaiter annuler une opération. ;;; Donc il faut 2 types d'environnements du style with-rollback ou ;;; with-direct-apply ;;; qui feraient respectivement les modification dans un tampon et directement ;;; sur la base. ;;; On ne considère pas d environnement du type with-read-access ou ;;; with-exclusive-access qui permettraient à un utilisateur de bloquer la base ;;; ou de lire en lectrue sur ne base sans pouvoir écrire,ca ce type ;;; de caractéristiques est géré au niveau de la base même (pas du langage SQL) ;;; ;;; ;;;Description des méthodes offertes: ;;;================================== ;;;Brièvement voici le déroulement d'une requête: ;;; ex: CREATE TABLE: ;;; (defun create-table (nomTable caracteristiques) ;;; (;;;formatage des données dans 'caracteristiques' et création ;;; d'une requete CREATE TABLE avec 'nom' + 'caracteristiques') ;;; (;;;connexion à la base) ;;; (;;;envoi de la requête SQL "CREATE TABLE") ;;; (;;;récupération de l'erreur éventuelle) ;;; (renvoi de "table created" ou "ERROR" )) ;;; ;;; Il en va de même pour les autres requêtes. --------------120266B7462B--  1,, X-Coding-System: nil Mail-from: From gaillard@enseirb.fr Thu Mar 1 10:20 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id KAA13945 for ; Thu, 1 Mar 2001 10:20:05 +0100 (MET) Received: from matho.enserb.u-bordeaux.fr (root@matho [147.210.18.2]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id KAA26853 for ; Thu, 1 Mar 2001 10:14:29 +0100 (MET) Received: from enseirb.fr (gaillard@localhost [127.0.0.1]) by matho.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id KAA01330 for ; Thu, 1 Mar 2001 10:16:07 +0100 (MET) Sender: gaillard@enseirb.fr Message-ID: <3A9E1356.161D3BAF@enseirb.fr> Date: Thu, 01 Mar 2001 10:16:06 +0100 From: GAILLARDOU Stephanie X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: Robert STRANDH Subject: EXAMEN LE Content-Type: multipart/mixed; boundary="------------D7EA3A88A46D54F8E0DBC8D3" Content-Length: 3052 *** EOOH *** Sender: gaillard@enseirb.fr Date: Thu, 01 Mar 2001 10:16:06 +0100 From: GAILLARDOU Stephanie X-Accept-Language: en To: Robert STRANDH Subject: EXAMEN LE Content-Type: multipart/mixed; boundary="------------D7EA3A88A46D54F8E0DBC8D3" Content-Length: 3052 This is a multi-part message in MIME format. --------------D7EA3A88A46D54F8E0DBC8D3 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Vous trouverez ci-joint l'examen de Langage Enchasse -- Stephanie Gaillardou 3eme annee informatique (ENSEIRB) mailto:gaillard@enseirb.fr --------------D7EA3A88A46D54F8E0DBC8D3 Content-Type: text/plain; charset=us-ascii; name="examX11.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="examX11.lisp" GAILLARDOU STEPHANIE EXAMEN Langage Enchasse ;;; QUESTION 1 ;;; ---------- (defun create-pixmap (window) (format t "creation du pixmap , ")) (defun copy-pixmap (pixmap window) (format t "copie du pixmap , ")) (defun destroy-pixmap (pixmap) (format t "destruction du pixmap ")) (defmacro with-buffering (window &rest operations) (let ((param (gensym))) `(let ((,param ,window)) (set ,window (create-pixmap ,window)) (progn ,@operations) (copy-pixmap ,window ,param) (destroy-pixmap ,window) (set ,window ,param)))) ;;; expansion de la macro (macroexpand '(with-buffering *window* (graphics-operation-1 *window*) (graphics-operation-2 *window*))) ;;; evaluation de la macro (with-buffering '*window* '(graphics-operation-1 *window*) '(graphics-operation-2 *window*)) ;;; QUESTION 2 ;;; ---------- ;;; On souhaite concevoir un langage enchasse pour SQL, c'est-a-dire concevoir un langage base ;;; sur les requetes SQL qui utilise les fonctionnalites de Lisp. ;;; La solution est de creer les requetes sous la syntaxe Lisp; les macros qui creent ces requetes ;;; retournent des formes : les requetes SQL. Ces requetes sont ensuite envoyes a la base par des ;;; fonctions Lisp qui retournent le resultat. ;;; Voici deux exemples de requete : ;;; SQL : "select nom from Person where (age > 20); " ;;; Lisp : (SQLquery 'select (with-attribut 'Person 'name) 'from 'Person 'where (with-operation '> 'age '20))) ;;; Lisp : (SQLquery 'insert 'into 'Person 'Values ;;; (with-operation '= 'name 'toto) (with-operation '= 'age (donne-age age-utilisateur))) ;;; Cette macro permet de creer une requete SQL avec en plus integre une fonction Lisp "donne-age" ;;; (qui permet a l'utilisateur de rentrer une condition de plus). Ceci n'etant pas possible en SQL pur, ;;; et permet donc d'agrandir SQL. ;;; Les operations proposes par ce langage enchasse sont: ;;; select,insert,update,create,drop,delete. ;;; Afin que ce langange enchasse puisse transformer facilement la requete en requete SQL, ;;; il faut des environnements comme: ;;; with-database (permet de donner en parametre la base sur laquelle ;;; s'effectue les requetes) ;;; with-operation (transforme par exemple (> age 20) en "age > 20"). ;;; with-attribut (transforme par exemple ('Person 'name) en "Person.name") --------------D7EA3A88A46D54F8E0DBC8D3--  1,, X-Coding-System: nil Mail-from: From achargui@enseirb.fr Thu Mar 1 11:15 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id LAA16396 for ; Thu, 1 Mar 2001 11:15:54 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id LAA10942; Thu, 1 Mar 2001 11:10:16 +0100 (MET) Received: from enseirb.fr (achargui@localhost [127.0.0.1]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id LAA03870; Thu, 1 Mar 2001 11:10:49 +0100 (MET) Sender: achargui@enseirb.fr Message-ID: <3A9E2029.AE0DD5A1@enseirb.fr> Date: Thu, 01 Mar 2001 11:10:49 +0100 From: ACHARGUI Sanaa X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr, achargui@enseirb.fr Subject: Examen Lisp (3eme annee ENSEIRB) Content-Type: multipart/mixed; boundary="------------379BFF6F95AA968A50655BF7" Content-Length: 3783 *** EOOH *** Sender: achargui@enseirb.fr Date: Thu, 01 Mar 2001 11:10:49 +0100 From: ACHARGUI Sanaa X-Accept-Language: en To: strandh@labri.u-bordeaux.fr, achargui@enseirb.fr Subject: Examen Lisp (3eme annee ENSEIRB) Content-Type: multipart/mixed; boundary="------------379BFF6F95AA968A50655BF7" Content-Length: 3783 This is a multi-part message in MIME format. --------------379BFF6F95AA968A50655BF7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Monsieur, Veuillez trouver ci-joint le fichier Lisp contenant les reponses aux deux questions de l'examen Lisp du Lundi 26 Fevrier. Cordialement, Sanaa ACHARGUI --------------379BFF6F95AA968A50655BF7 Content-Type: text/plain; charset=iso-8859-1; name="exam_lisp.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam_lisp.lisp" ;; Sanaa ACHARGUI ;; Question 1 ;;~~~~~~~~~~~ ;;; La macro suivante permet l'utilisation (de manière transparente) du pixmap ;;; pour effectuer des opérations graphiques sur la fenêtre passée en paramètre (defmacro with-buffering (window &rest operations) (let ((var_tmp (gensym))) `(let ((,var_tmp ,window)) ;stockage de la valeur initiale de la fenetre (progn (setf ,window (create-pixmap ,window)) (if (and ,@operations); on suppose que "and" retourne true si pas d'erreurs dans les opérations graphiques (copy-pixmap ,window ,var_tmp)) ;copie effectuee s'il n'y a pas d'erreurs (destroy-pixmap ,window) (setf ,window ,var_tmp))))) ;Si pas d'erreurs "window" a toujours sa valeur initiale sinon sa nouvelle valeur ;;; On teste le résultat de l'expansion de la macro "with-buffering" (macroexpand '(with-buffering win (dessiner-cercle win) (dessiner-triangle win) (changer-taille win))) ;;; Les fonctions suivantes permettent de tester l'évaluation de "with-buffering" (defun create-pixmap (window) (progn (format T "Creation d'un pixmap P de la taille de la fenetre ~A~%" window)) 'P) (defun copy-pixmap (pixmap window) (format T "Copie du pixmap ~A dans la fenetre ~A~%" pixmap window)) (defun destroy-pixmap (pixmap) (format T "Destruction du pixmap ~A~%" pixmap)) ;; On suppose qu'on définit la variable globale *window* comme une liste de 3 éléments ;; (par exemple une fonction d'initialisation qui prend une hauteur et une largeur de ;; fenetre en parametres). (defvar *window* '(a b c)) (with-buffering *window* '(dessiner-cercle *window*) '(dessiner-triangle *window*) '(changer-taille *window*)) ;;Question 2 ;;~~~~~~~~~~ Voici une approche permettant de concevoir un langage enchâssé pour SQL: On crée des fonctions Lisp permettant de se connecter, de se déconnecter et d'effectuer des requêtes SQL classiques (SELECT, UPDATE,...). Exemple: (defun UPDATE ...) (defun SELECT ...) Les fonctions Lisp ainsi définies se chargeront de traduire les éléments passés en paramètres en chaine de caractères contenant la requête SQL à envoyer. A partir de ces fonctions, on définit une macro qui interprète aussi bien les requêtes de type SQL (select, ...) que les éléments du langage Lisp. Elle permet donc d'obtenir un langage enchâssé pour SQL combinant les fonctionnalités de SQL avec les facilités offertes par le langage Lisp. On pourrait par exemple écrire: (interpreter (cond ((null (select ... )))). On peut ainsi construire des requêtes SQL élaborées de la même facon que PL/SQL ou PROC, qui exploiteront toute la puissance du langage CommonLisp. Pour gérer les transactions vers une base particulière, on aura besoin d'un environnement "with-transaction" qui permet de commencer une transaction avec la base et de la valider uniquement si les opérations passées en paramètres se terminent normalement (sans erreurs ni exceptions). Pour cela, on définit la macro with-transaction de la forme suivante: (defmacro with-transaction (&key database &body body) ...) "database" est la base avec laquelle on ouvre une connection "body" est l'ensemble d'opérations à exécuter dans le cadre d'une transaction avec "database" --------------379BFF6F95AA968A50655BF7--  1,, Summary-line: 1-Mar fauchill@enseirb.fr [143] #Examen de LE (ENSEIRB) X-Coding-System: nil Mail-from: From fauchill@enseirb.fr Thu Mar 1 12:03 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id MAA18367 for ; Thu, 1 Mar 2001 12:03:50 +0100 (MET) Received: from vendemiaire.enserb.u-bordeaux.fr (root@vendemiaire [147.210.19.163]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id LAA22461; Thu, 1 Mar 2001 11:58:13 +0100 (MET) Received: from enseirb.fr (fauchill@localhost [127.0.0.1]) by vendemiaire.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id MAA22405; Thu, 1 Mar 2001 12:00:01 +0100 (MET) Sender: fauchill@enseirb.fr Message-ID: <3A9E2BB1.1F6FCD78@enseirb.fr> Date: Thu, 01 Mar 2001 12:00:01 +0100 From: Olivier FAUCHILLE Organization: E.N.S.E.I.R.B. X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr, fauchill@enseirb.fr Subject: Examen de LE (ENSEIRB) Content-Type: multipart/mixed; boundary="------------E47D176287A836760D813517" Content-Length: 3646 *** EOOH *** Sender: fauchill@enseirb.fr Date: Thu, 01 Mar 2001 12:00:01 +0100 From: Olivier FAUCHILLE Organization: E.N.S.E.I.R.B. X-Accept-Language: en To: strandh@labri.u-bordeaux.fr, fauchill@enseirb.fr Subject: Examen de LE (ENSEIRB) Content-Type: multipart/mixed; boundary="------------E47D176287A836760D813517" Content-Length: 3646 This is a multi-part message in MIME format. --------------E47D176287A836760D813517 Content-Type: multipart/alternative; boundary="------------ECD4D4A75B16E54AD5E59866" --------------ECD4D4A75B16E54AD5E59866 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Monsieur, je vous envoie ci-joint la solution que je propose a l'examen de LE. Cordialement -- ------------------------------------------------------------------- Olivier Fauchille -> mailto:fauchill@enseirb.fr ------------------------------------------------------------------- --------------ECD4D4A75B16E54AD5E59866 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit
Monsieur,
je vous envoie ci-joint la solution que je propose a l'examen de LE.
Cordialement
-- 
-------------------------------------------------------------------
  Olivier Fauchille 
        -> mailto:fauchill@enseirb.fr
-------------------------------------------------------------------
  --------------ECD4D4A75B16E54AD5E59866-- --------------E47D176287A836760D813517 Content-Type: text/plain; charset=iso-8859-1; name="exam.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.lisp" ;;; Olivier FAUCHILLE ;; Examen de Langages enchassés ;; Question 1 : ;; ------------- ;; La macro suivante remplit les conditions demandées pour l'utilisation ;; transparente de pixmap pour les fenêtres : ;; copy-pixmap fait la copie s'il n'y a pas d'erreur ;; car on suppose que les fonctions graphiques renvoient ;; un booléen FAUX lorsque une erreur s'est produite (defmacro with-buffering (*window* &body body) (let ((initial (gensym))) `(let ((,initial ,*window*)) ; sauvegarde de l'etat initial (progn (set ,*window* (create-pixmap ,*window*)) (if (and ,@body) (copy-pixmap ,*window* ,initial)) ; valeur de retour (destroy-pixmap ,*window*) (set ,*window* ,initial))))) ;; et on teste cette macro à partir de l'appel à macroexpand suivant : (macroexpand '(with-buffering fenetre (action1 fenetre)(action2 fenetre))) ;; Question 2 : ;; -------------- Solution envisagée pour concevoir un langage enchassé pour SQL : définir une macro CommonLisp qui interprète les commandes SQL via des fonctions Lisp et les traite de manière à effectuer des appels à la base de donnée. Il faut créer les fonctions Lisp qui effectuent les connexions, déconnexions et envoi de requêtes. Pour les requêtes, nos fonctions gèreront les "select" et les "update" proprement dits sur la base de données, c'est à dire qu'elles seront responsables de la traduction des demandes : (defun select ......) (defun update ......) A partir de ces fonctions, une macro "interpretation" permettra de faire l'interprétation des requêtes. Cette dernière saura aussi bien interpréter les commandes des fonctions (select, update,...) que des commandes Lisp (les branchements conditionnels ou autres). Exemple : (interpretation (if (select ....) (...))) Le langage résultant permettra d'exécuter des requêtes qui seront la combinaison de fonctions issues du langage Lisp et de nos fonctions supplémentaires pour le SQL. Une macro créant un environnement de transactions with-connection, permettrait d'identifier la base et de créer les connections, d'émettre les requêtes passées en paramètre de manière transparente. --------------E47D176287A836760D813517--  1,, Summary-line: 1-Mar rochard@enseirb.fr [483] #Examen langage enchasse X-Coding-System: nil Mail-from: From rochard@enseirb.fr Thu Mar 1 12:12 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id MAA18738 for ; Thu, 1 Mar 2001 12:12:44 +0100 (MET) Received: from narrhavas (rochard@narrhavas [147.210.18.145]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with SMTP id MAA28466 for ; Thu, 1 Mar 2001 12:07:08 +0100 (MET) Sender: rochard@enseirb.fr Message-ID: <3A9E2DBD.609@enseirb.fr> Date: Thu, 01 Mar 2001 12:08:45 +0100 From: ROCHARD Cyril X-Mailer: Mozilla 3.0 (X11; I; SunOS 5.7 sun4u) MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen langage enchasse Content-Type: multipart/mixed; boundary="------------69E55EA16830" Content-Length: 10709 *** EOOH *** Sender: rochard@enseirb.fr Date: Thu, 01 Mar 2001 12:08:45 +0100 From: ROCHARD Cyril To: strandh@labri.u-bordeaux.fr Subject: Examen langage enchasse Content-Type: multipart/mixed; boundary="------------69E55EA16830" Content-Length: 10709 This is a multi-part message in MIME format. --------------69E55EA16830 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour Je vous transmet les fichiers correpndant a l'examen a savoir : - ex.ps : reponses aux questions - buffer.lisp : sources lisp de la 1ere questions + tests Cordialement Cyril Rochard --------------69E55EA16830 Content-Type: application/postscript; name="ex.ps" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ex.ps" %!PS-Adobe-3.0 %%Creator: a2ps version 4.6.1 %%CreationDate: Thu Mar 1 11:39:31 2001 %%Pages: (atend) %%DocumentFonts: Courier Courier-Oblique Courier-BoldOblique Times-Roman Courier-Bold Helvetica Helvetica-Bold Symbol %%EndComments % Copyright (c) 1993, 1994, Miguel Santana, M.Santana@frgu.bull.fr /$a2psdict 100 dict def $a2psdict begin % General macros. /xdef {exch def} bind def /getfont {exch findfont exch scalefont} bind def % Set up ISO Latin 1 character encoding /reencodeISO { dup dup findfont dup length dict begin { 1 index /FID ne { def }{ pop pop } ifelse } forall /Encoding ISOLatin1Encoding def currentdict end definefont } def /Helvetica-Bold reencodeISO def /Helvetica reencodeISO def /Courier reencodeISO def /Courier-Bold reencodeISO def /Courier-Oblique reencodeISO def /Courier-BoldOblique reencodeISO def /Times-Roman reencodeISO def % Create Courier backspace font /backspacefont { /Courier findfont dup length dict begin { % forall 1 index /FID eq { pop pop } { def } ifelse } forall currentdict /UniqueID known { % if /UniqueID UniqueID 16#800000 xor def } if CharStrings length 1 add dict begin CharStrings { def } forall /backspace { -600 0 0 0 0 0 setcachedevice } bind def currentdict end /CharStrings exch def /Encoding Encoding 256 array copy def Encoding 8 /backspace put currentdict end definefont pop } bind def % FUNCTIONS % Function filename: Initialize file printing. /fn { /filenm xdef /filenmwidth filenm stringwidth pop def /filenmfont filenmwidth fns gt { filenmfontname fnfs fns mul filenmwidth div getfont } { sfnf } ifelse def } bind def % Function header: prints page header. no page % is passed as argument. /hp { x sd get y sd get hs sub 1 add moveto df setfont gsave x sd get y sd get moveto 0 hs 2 div neg rmoveto hs setlinewidth 0.95 setgray pw 0 rlineto stroke grestore gsave dfs hm rmoveto d show % date/hour grestore gsave pnum cvs pop % page pop up pw (Page 999) stringwidth pop sub hm rmoveto (Page ) show pnum show % page number grestore empty pnum copy pop gsave filenmfont setfont fns filenm stringwidth pop sub 2 div dw add bm 2 mul add hm rmoveto filenm show % file name grestore } bind def % Function border: prints border page /border { x sd get y sd get moveto gsave % print four sides 0.7 setlinewidth % of the square pw 0 rlineto 0 ph neg rlineto pw neg 0 rlineto closepath stroke grestore } bind def % Function hborder: completes border of the header. /hborder { gsave 0.7 setlinewidth 0 hs neg rmoveto pw 0 rlineto stroke grestore } bind def % Function sheetnumber: prints the sheet number. /sn { snx sny moveto df setfont pnum cvs dup stringwidth pop (0) stringwidth pop sub neg 0 rmoveto show empty pnum copy pop } bind def % Function loginprint: prints the login id of the requestor. /lgp { lx ly moveto df setfont dup stringwidth pop neg 0 rmoveto show } bind def % Function current_date: prints the current date. /cd { dx dy moveto df setfont (Printed: ) show td show } bind def % Function filename_footer: prints the file name at bottom of page. /fnf { fnx fny moveto df setfont footer center show } bind def % Function center: centers text. /center { dup stringwidth pop 2 div neg 0 rmoveto } bind def % Function s: print a source line /s { show /y0 y0 bfs sub def x0 y0 moveto } bind def % Functions b, st, i, bi, t, sy: change to bold, standard, italic, bold-italic, times and symbol fonts /b { show bdf setfont } bind def /st { show bf setfont } bind def /i { show itf setfont } bind def /bi { show bif setfont } bind def /t { show tf setfont } bind def /sy { show sf setfont } bind def % Function T(ab), jumps to the n-th tabulation in the current line /T { exch show cw 8 mul mul sx cw mul add x0 add y0 moveto } bind def % Strings used to make easy printing numbers /pnum 12 string def /empty 12 string def % Global initializations /CourierBack backspacefont /filenmfontname /Helvetica-Bold def /inch {72 mul} bind def % %% Meaning of some variables and functions (coded names) % % Variables from 'outside' % twp: twinpages? % sd: sheet side % l: line counter % c: column counter % d: date % td: current date (for today) % lg: login name % Functions % fn: filename printing function % sn: sheetnumber printing function % cd: current date printing function % fnf: filename footer printing function % lgp: login printing function % hp: header printing function % Coordinates % x, y: the logical page % snx, sny: the sheet number % dx, dy: the date % lx, ly: the login % fnx, fny: the filename (footer) % scx: x coordinate for the sheet center % Font sizes % fnfs: filename % bfs: body % dfs: date % Fonts % df: date % bf: body % bdf: bold % itf: italic % tf: times % sf: symbol % sfnf: standard filename % Widths and heigths % cw: a Courier char % dw: date % pw, ph: page % sw, sh: sheet % Margins % hm: header % tm: top % bm: body % rm: right % lm: left % hs: header size % fns: filename size % Initialize page description variables. /x0 0 def /y0 0 def /sh 11.64 inch def /sw 8.27 inch def /margin 1.4 inch def /rm margin 3 div def /lm margin 2 mul 3 div def /d () def /td (Mar 1 2001 11:39) def /lg (Printed by ROCHARD Cyril from narrhavas) def %%EndProlog /docsave save def %%Page: 1 1 /pagesave save def /twp false def /fnfs 15 def /dfs fnfs 0.8 mul def /df /Helvetica dfs getfont def /dw df setfont td stringwidth pop def /sfnf filenmfontname fnfs getfont def /hm fnfs 0.25 mul def /hs 0.29 inch def /bfs 9 def /bdf /Courier-Bold bfs getfont def /bm bfs 0.7 mul def /bf /CourierBack bfs getfont def /cw bf setfont (0) stringwidth pop def /itf /Courier-Oblique bfs getfont def /bif /Courier-BoldOblique bfs getfont def /tf /Times-Roman bfs getfont def /sf /Symbol bfs getfont def /l 78 def /c 90 def /pw bf setfont (0) stringwidth pop c mul bm dup add add def /ph bfs l mul bm dup add add hs add def /fns pw fnfs 4 mul dw add (Page 999) stringwidth pop add sub def /tm margin twp {3} {2} ifelse div def /sd 0 def /x [ lm dup ] def /sny tm dfs 2 mul sub def /snx sw rm sub dfs sub def /dy sny def /dx lm def % Only one logical page /y [ sh tm sub dup ] def /scx sw 2 div def /fny dy def /fnx scx def /ly fnfs 2 div y sd get add def /lx snx def /sx 1 def /d (Mar 1 2001 11:31) def ( ex.txt ) fn /footer filenm def 1 hp border hborder /x0 x 0 get bm add def /y0 y 0 get bm bfs add hs add sub def x0 y0 moveto bf setfont ( -----------) s ( Question 1:) s ( -----------) s ( ) s ( \(defmacro with-buffering \(window &body operations\)) s ( \(let \(\(win \(gensym\)\) \(pixmap \(gensym\)\)\)) s ( `\(progn) s ( \(let* \(\(,win ,window\)) s ( \(,pixmap \(create-pixmap ,win\)\)) s ( \(,window ,pixmap\)\)) s ( ,@operations) s ( \(copy-pixmap ,pixmap ,win\)) s ( \(destroy-pixmap ,pixmap\)) s ( \(setq ,window ,win\)\)\)\)\)) s ( ) s ( ) s ( -----------) s ( Question 2:) s ( -----------) s ( ) s ( Pour integrer le langage SQL a Lisp, une approche langage enchasse est) s ( envisageable. Une solution possible est de creer une extension a Lisp) s ( implementant la norme SQL. Cette extension devra respecter la syntaxe) s ( Lisp et imposera donc de developper un SQL parenthese. Cette solution) s ( pourra etre implementee au moyen de macros Lisp et reposera sur une) s ( API de communication avec une base \(type pont ODBC\).) s ( ) s ( avantages:) s ( - homogeneisation de la syntaxe et donc simplification du) s ( developpement.) s ( - utilisation des fonctionnalites du Lisp) s ( ) s ( difficultes:) s ( - definir une semantique SQL en Common Lisp qui permettra) s ( d'avoir la meme expressivite que SQL seul et respectera la) s ( norme SQL.) s ( ) s ( operations:) s ( - connexion et deconnexion a une base :) s ( \(sql-connect database\) ) s ( \(sql-disconnect database\)) s ( - consultation de la base :) s ( \(sql-select var :from table :where condition\)) s ( - modification de la base :) s ( \(sql-update ...\)) s ( \(sql-insert ...\)) s ( \(sql-delete ...\)) s ( ) s ( environnement:) s ( - \(with-sql-result \(sql-query &body body\)\)) s /sd 0 def 1 sn lg lgp pagesave restore showpage %%Page: 2 2 showpage %%Trailer %%Pages: 2 docsave restore end --------------69E55EA16830 Content-Type: text/plain; charset=us-ascii; name="buffer.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="buffer.lisp" (defun create-pixmap (window) (format t "creation pixmap pour ~D" window)) (defun copy-pixmap (pixmap window) (format t "copie pixmap ~D pour ~D" pixmap window)) (defun destroy-pixmap (pixmap) (format t "destruction pixmap ~D" pixmap)) (defun graphics-operation-1 (window) (format t "operation graphique 1 sur ~D" window)) (defun graphics-operation-2 (window) (format t "operation graphique 2 sur ~D" window)) (defun graphics-operation-3 (window) (format t "operation graphique 3 sur ~D" window)) (defmacro with-buffering (window &body operations) (let ((win (gensym)) (pixmap (gensym))) `(progn (let* ((,win ,window) (,pixmap (create-pixmap ,win)) (,window ,pixmap)) ,@operations (copy-pixmap ,pixmap ,win) (destroy-pixmap ,pixmap) (setq ,window ,win))))) (setq *window* 1) (macroexpand '(with-buffering *window* (graphics-operation-1 *window*) (graphics-operation-2 *window*))) (macroexpand '(with-buffering *window*)) (with-buffering *window* (graphics-operation-1 *window*) (graphics-operation-2 *window*)) --------------69E55EA16830--  1,, Summary-line: 1-Mar verdiert@enseirb.fr [105] #Examen LE X-Coding-System: nil Mail-from: From verdiert@enseirb.fr Thu Mar 1 12:28 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id MAA19301 for ; Thu, 1 Mar 2001 12:28:17 +0100 (MET) Received: from enseirb.fr (verdiert@narrhavas [147.210.18.145]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id MAA02461 for ; Thu, 1 Mar 2001 12:22:41 +0100 (MET) Sender: verdiert@enseirb.fr Message-ID: <3A9E3163.3D715C60@enseirb.fr> Date: Thu, 01 Mar 2001 12:24:19 +0100 From: VERDIER Thierry X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------256C80E9DDE18762A668C6BF" Content-Length: 2726 *** EOOH *** Sender: verdiert@enseirb.fr Date: Thu, 01 Mar 2001 12:24:19 +0100 From: VERDIER Thierry X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------256C80E9DDE18762A668C6BF" Content-Length: 2726 This is a multi-part message in MIME format. --------------256C80E9DDE18762A668C6BF Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------256C80E9DDE18762A668C6BF Content-Type: text/plain; charset=iso-8859-1; name="exam.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.lisp" ; Examen de langages enchassés ; Thierry Verdier GL ; EXERCICE 1 (defmacro with-buffering (window &body body) (let ((tmp (gensym)) (pixmap (gensym))) `(progn (set ,tmp ,window) (set ,pixmap (create-pixmap ,window)) (set ,window ,pixmap) ,@body (copy-pixmap ,pixmap ,window) (destroy-pixmap ,pixmap) (set ,window ,tmp)))) (macroexpand '(with-buffering *window* (op1 *window*) (op2 *window*))) ; EXERCICE 2 La première étape pour pouvoir éxécuter des requêtes sur un serveur SQL, est la connection à la base de données. Pour cela on pourrait utiliser une macro with-db qui permettrait de se connecter et ensuite d'effectuer une série d'opérations. Il serait également possible de placer en arguments des paramètres, tels que le nom de l'utilisateur et son mot de passe. Cette macro assurerait la connection avec le serveur SQL. (with-db *database* (*parameter1* *parameter2* ...) *operation1* *operation2* ...) Toutes les opérations sur la base de donnée seraient regroupées dans l'environnement with-operation. Il s'occuperait de reformater les requêtes pour qu'elles soient comprises par le serveur SQL, et mettrait aussi en forme les données récupérées après éxécution d'une requête. (with-operation 'select (nom prenom) :From personne :Where (string= nom "Dupond")) (with-operation 'insert '("Dupond" "Jean") :into personne (nom prenom)) Pour éviter certaines ambiguïtés lorsqu'on a deux tables qui ont un champ ayant le même nom, il faut aussi créer un environnement pour les éléments des tables. (with-attribut *table* *attribut*) (with-attribut personne nom) On obtient ainsi les requêtes de la forme : (with-operation 'select ((with-attribut personne nom) (with-attribut personne prenom)) :From personne :Where (string= (with-attribut personne nom) "Dupond")) Le problème de ce langage est qu'il n'est pas vraiment enchassé. En effet, il existe certaines commandes lisp qui ne peuvent être éxécutées sur le serveur SQL. La seule solution pour résoudre ce problème serait de récupérer les données à partir de la base de données dans l'environnement lisp et ensuite de faire le calcul dessus. Cependant cette méthode n'est pas envisageable, en effet si les tables sont grandes, il est impossible de récuperer toutes les données. --------------256C80E9DDE18762A668C6BF--  1,, Summary-line: 1-Mar geiger@enseirb.fr [95] #Examen de LE: remise de copie X-Coding-System: nil Mail-from: From geiger@enseirb.fr Thu Mar 1 13:31 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id NAA21455 for ; Thu, 1 Mar 2001 13:31:40 +0100 (MET) Received: from enseirb.fr (geiger@spendius [147.210.18.14]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id NAA22393 for ; Thu, 1 Mar 2001 13:26:05 +0100 (MET) Sender: geiger@enseirb.fr Message-ID: <3A9E405A.D28B524E@enseirb.fr> Date: Thu, 01 Mar 2001 13:28:10 +0100 From: Anthony Geiger X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: fr, en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen de LE: remise de copie Content-Type: multipart/mixed; boundary="------------7575D95F215AC17D73937A50" Content-Length: 3907 *** EOOH *** Sender: geiger@enseirb.fr Date: Thu, 01 Mar 2001 13:28:10 +0100 From: Anthony Geiger X-Accept-Language: fr, en To: strandh@labri.u-bordeaux.fr Subject: Examen de LE: remise de copie Content-Type: multipart/mixed; boundary="------------7575D95F215AC17D73937A50" Content-Length: 3907 This is a multi-part message in MIME format. --------------7575D95F215AC17D73937A50 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour, Veuillez trouver en attachement, conformement aux indications figurant sur l'enonce, ma copie de Langages Enchasses. A. Geiger --------------7575D95F215AC17D73937A50 Content-Type: text/plain; charset=us-ascii; name="examen.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="examen.lisp" ;; Premiere question (defun create-pixmap (window) (format t "Appel de create-pixmap ") 'mywindow) ;; on retourne une "window" pour l'affectation dans la macro (defun copy-pixmap (pixmap window) (format t "Appel de copy-pixmap ")) (defun destroy-pixmap (pixmap) (format t "Appel de destroy-pixmap ")) (defmacro with-buffering (window &rest operations) (let ((param (gensym))) ;; pour stocker la valeur initiale de la fenetre `(let ((,param ,window)) ;; stockage de la valeur initiale (set ,window (create-pixmap ,window)) ;; creation du pixmap, utilite du retour pour create-pixmap (progn ,@operations) ;; on effectue les operations graphiques (copy-pixmap ,window ,param) ;; remplacement de la fenetre affichee par le pixmap (destroy-pixmap ,window) ;; -> on n'a plus besoin du pixmap (set ,window ,param)))) ;; si operations reussies, aucun changement, sinon restauration de la valeur initiale de window (macroexpand '(with-buffering '*window* '(op1 *window*))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Deuxieme question La solution consisterait a ecrire une fonction Lisp pour chacune des operations proposees par SQL (comme par exemple select, create, insert...). Ces fonctions se chargeraient de "l'interfacage de bas niveau" et de la transmission de la requete sous une bonne forme a la base de donnees; la requete serait ecrite "en parametre de la fonction"(voir les exemples d'utilisation). Un utilisateur utilisant ces fonctions ne verrait jamais (et n'aurait pas a gerer) la question de l'interfacage de bas niveau: les appels seraient inclus directement dans la fonction. Il me parait important de signaler que ces fonctions auront autant que possible la responsabilite de proceder a une evaluation des arguments qui leur sont passes (j'entends par la, de tout sauf des mots-cles SQL) afin de permettre l'utilisation dans les requetes de fonctions Lisp, de branchements... Exemple d'utilisation: (insert into Personne values '("Toto" "Dupont" 12 "M") '("Tata" "Lehmann" 23 "F")) (select * from Personne where (= name "Toto")) Un exemple avec des instructions Lisp: (select Name from Personne where (and (= surname (if (= day monday) "Dupont" "Lehmann")) (= age (f x)))) qui donne une requete differente selon que le jour est lundi ou non, et demande que l'age soit egal a une fonction d'un entier quelconque x. Un exemple d'environnement qu'il est necessaire de definir est quelque chose qu'on pourrait appeller with-database, qui permettra a l'utilisateur de preciser la base de donnees a laquelle il souhaite se connecter, ainsi que des paramtres de la connexion comme son nom d'utilisateur et son mot de passe. En effet, l'interfacage de bas niveau lui etant transparent, il faut lui donner un moyen de passer des parametres aux fonctions de bas niveau, et cette macro serait une bonne solution: elle prendrait en parametre le nom de la base de donnees, ses parametres de connexion, et la sequence de requetes a executer, puis automatiserait l'execution de l'ensemble des requetes. On pourrait aussi imaginer des environnements permettant de formater les donnees de retour en provenance de la base de donnees: un environnement with-table pourrait presenter les resultats sous forme de tableaux par exemple. --------------7575D95F215AC17D73937A50--  1,, Summary-line: 1-Mar frechett@enseirb.fr [113] #Examen LE X-Coding-System: nil Mail-from: From frechett@enseirb.fr Thu Mar 1 13:46 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id NAA22137 for ; Thu, 1 Mar 2001 13:46:27 +0100 (MET) Received: from enseirb.fr (frechett@floreal [147.210.19.166]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id NAA24817 for ; Thu, 1 Mar 2001 13:40:52 +0100 (MET) Message-ID: <3A9E43A5.5070404@enseirb.fr> Date: Thu, 01 Mar 2001 13:42:13 +0100 From: Jimi Frechette User-Agent: Mozilla/5.0 (X11; U; SunOS 5.7 sun4u; en-US; 0.7) Gecko/20010110 X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------030504040909030104050403" Content-Length: 3044 *** EOOH *** Date: Thu, 01 Mar 2001 13:42:13 +0100 From: Jimi Frechette User-Agent: Mozilla/5.0 (X11; U; SunOS 5.7 sun4u; en-US; 0.7) Gecko/20010110 X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------030504040909030104050403" Content-Length: 3044 This is a multi-part message in MIME format. --------------030504040909030104050403 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Voici mon examen. Jimi Frechette --------------030504040909030104050403 Content-Type: text/plain; name="exam11.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exam11.lisp" I) (defmacro with-buffering (window &rest operations) ;;Macro (let ((param (gensym))) ;; On genere une variable unique `(let ((,param ,window)) ;; on sauvegarde window dans la nouvelle variable (set ,window (create-pixmap ,window)) ;; on cree un pixmap que l'on met dans window (progn ,@operations) ;; on execute toutes les operation (copy-pixmap ,window ,param) ;; on copie le pixmap sauvegardee (destroy-pixmap ,window) ;; on detruit le pixmap (set ,window ,param)))) ;; on redonne la valeur initiale (defun create-pixmap (window) (format t "Creation d'un pixmap")) (defun copy-pixmap (pixmap window) (format t "Copie d'un pixmap")) (defun destroy-pixmap (pixmap) (format t "Destruction d'un pixmap")) ;; expansion (macroexpand '(with-buffering *window* (op-graphic-1 *window*) (op-graphic-2 *window*))) ;; evaluation (with-buffering '*window* '(op-graphic-1 *window*) '(op-graphic-2 *window*)) II) Un langage enchasse en lisp pour SQL, permettrais de pouvoir rendre accessible les fonctionnalites d'un language de requete de base de donnees a un programmeur lisp. Un exemple d'un tel language enchasse, serait un simple "select * from table where cond". Un language enchasse lisp, devrait deja s'affranchir des types. Etant donne que SQL est assez fortement type, cela pose un premier probleme. Mais ce probleme n'apparait reelement que lorsque l'on veut creer une table via le le langage enchasse lisp. La solution serait d'etablir des macros lisp, qui genereraient des requetes en langage SQL qui ensuite seraient envoyees au SGBDR. Le retour serait assure par des fonctions lisp. Il faut aussi noter que le retour peut aussi etre traite par ces memes macros: cas typique de select imbriques. Les macro lisp serait appele d'abord par leur nom: (select (insert (create (drop (delete (update exemple de requete SQL select * from Entreprise where CA=15000 exemple lisp (sql-operation-select ( ('*) ;; Liste d'elements a selectionner ) ( ('Entreprise) ;; Liste de tables ) ('= CA 15000) ;; Liste des clauses ( ) ) Cette macro nous donne au resultat affiche a l'ecran grace aux fonctions d'affichage ligne par ligne. Un tel langage enchasse pourrait s'averer tres pratique aussi pour s'affranchir des problemes lie a SQL. Tel que la manipulation de la sortie (afficher que les 100 premieres lignes), ou implementer des conditions sur la sortie (tel que le PL/SQL avec IF, LOOP...). Les environnements qui me paraissent utile sont: with-database ;; pour selectionner la base de donnees with-user ;; pour selectionner un utilisateur --------------030504040909030104050403--  1,, Summary-line: 1-Mar stefani@enseirb.fr [95] #examen de LE X-Coding-System: nil Mail-from: From stefani@enseirb.fr Thu Mar 1 13:49 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id NAA22247 for ; Thu, 1 Mar 2001 13:49:40 +0100 (MET) Received: from matho.enserb.u-bordeaux.fr (root@matho [147.210.18.2]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id NAA25513 for ; Thu, 1 Mar 2001 13:44:03 +0100 (MET) Received: from enseirb.fr (stefani@localhost [127.0.0.1]) by matho.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id NAA08265 for ; Thu, 1 Mar 2001 13:45:40 +0100 (MET) Sender: stefani@enseirb.fr Message-ID: <3A9E4474.B3A95CAD@enseirb.fr> Date: Thu, 01 Mar 2001 13:45:40 +0100 From: Pierre STEFANI X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: examen de LE Content-Type: multipart/mixed; boundary="------------49DFC5D327DE7B27FF1A50B1" Content-Length: 2522 *** EOOH *** Sender: stefani@enseirb.fr Date: Thu, 01 Mar 2001 13:45:40 +0100 From: Pierre STEFANI X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: examen de LE Content-Type: multipart/mixed; boundary="------------49DFC5D327DE7B27FF1A50B1" Content-Length: 2522 This is a multi-part message in MIME format. --------------49DFC5D327DE7B27FF1A50B1 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------49DFC5D327DE7B27FF1A50B1 Content-Type: text/plain; charset=iso-8859-1; name="examen.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="examen.txt" Pierre STEFANI ENSEIRB, troisième année, option génie logiciel Jeudi 1er mars 2001 EXAMEN DE LANGAGES ENCHASSES 1. ;;; Technique de tampons pour la mise à jour d'une fenêtre (defmacro with-buffering (window &body body) (let ((new-w (gensym)) (copy-w (gensym))) `(let* ((,copy-w ,window) ; stocke la valeur de la variable donnée en paramètre dans une variable locale temporaire (,window (create-pixmap ,window))) ; crée un pixmap et stocke ce pixmap dans la variable donnée en paramètre (progn ,@body) ; effectue les opérations graphiques (copy-pixmap ,window ,new-w) ; copie le pixmap créé (destroy-pixmap ,window) ; détruit le pixmap créé (setf (,window ,copy-w)) ; rend à la variable donnée en paramètre sa valeur initiale ,new-w))) 2. Nous pouvons concevoir de définir une macro CommonLisp qui interprèterait des commandes SQL grâce à des fonctions Lisp que nous définirions. Cette macro se chargerait d'effectuer les appels à la base de données afin de réaliser sur la base ces commandes SQL. Par la suite, nous appellerons cette macro "sqlinterprete". Les fonctions Lisp que nous aurons a définir sont principalement les commandes de connexion/déconnexion et les commandes de requêtes. Ces fonctions devront communiquer directement avec la base de données, en effectuant l'interprétation des commandes. Ainsi concernant les requêtes, nous aurons notamment une fonction "select" et une fonction "update". (defun select (...)) (defun update (...)) La fonction "select" se chargera en plus de la récupération des réponses de la base. Grâce à ces fonctions, notre macro "sqlinterprete" permettra à l'utilisateur d'effectuer ses requêtes en SQL. De plus, il pourra intégrer à ses commandes SQL des commandes Lisp. Par exemple : (sqlinterprete (do (...) (select ...))) Cette combinaison de commandes SQL et de commandes Lisp apportera un véritable "plus" au langage SQL classique. Les environnement du style with- qui seraient intéressants pour l'utilisateur sont donc "update", ainsi que "select" qui correspondrait au "with-answer" vu en cours. --------------49DFC5D327DE7B27FF1A50B1--  1,, Summary-line: 1-Mar nicolas@enseirb.fr [111] #Examen LE X-Coding-System: nil Mail-from: From nicolas@enseirb.fr Thu Mar 1 14:03 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id OAA22781 for ; Thu, 1 Mar 2001 14:03:30 +0100 (MET) Received: from enseirb.fr (nicolas@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id NAA01107 for ; Thu, 1 Mar 2001 13:57:55 +0100 (MET) Sender: nicolas@enseirb.fr Message-ID: <3A9E4774.CA26CDD0@enseirb.fr> Date: Thu, 01 Mar 2001 13:58:28 +0100 From: Pierre-Yves Nicolas X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: French, fr, en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------D76931C15B8C201DC483B490" Content-Length: 2516 *** EOOH *** Sender: nicolas@enseirb.fr Date: Thu, 01 Mar 2001 13:58:28 +0100 From: Pierre-Yves Nicolas X-Accept-Language: French, fr, en To: strandh@labri.u-bordeaux.fr Subject: Examen LE Content-Type: multipart/mixed; boundary="------------D76931C15B8C201DC483B490" Content-Length: 2516 This is a multi-part message in MIME format. --------------D76931C15B8C201DC483B490 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Vous trouverez ci-joint mon examen de LE. Cordialement, Pierre-Yves Nicolas --------------D76931C15B8C201DC483B490 Content-Type: text/plain; charset=iso-8859-1; name="exam.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.txt" Pierre-Yves NICOLAS Examen de Langages Enchâssés Question 1 : ---------- La macro with-buffering (defmacro with-buffering (window &body body) (let ((tmp-window (gensym))) `(let ((,tmp-window ,window)) (setf ,window (create-pixmap ,window)) ,@body (copy-pixmap ,window ,tmp-window) (destroy-pixmap ,window) (setf ,window ,tmp-window)))) Question 2 : ---------- Il s'agit de concevoir un langage enchâssé pour SQL avec Common Lisp. On se propose donc de définir un ensemble de constructions Lisp (fonctions, macros) permettant d'effectuer en Common Lisp des requêtes à une base SQL. Ces constructions généreront le code nécessaire à la connexion à la base, l'envoi de requêtes, la récupération de résultats, et la déconnexion à partir de fonctions d'interfaçage de bas-niveau. Les requêtes sont entrées à l'aide de constructions correspondant aux opérations SQL générant le code SQL à soumettre à la base sous la forme d'une chaîne de caractères : select, insert, update, delete, create, drop ... L'exemple suivant nous montre une requête possible : (select nom :from 'client :where '(= ville Bordeaux)) L'argument where du select de SQL est une expression SQL. La difficulté principale de cette solution est donc de transformer les arguments passés aux fonctions Lisp du type select en expressions SQL valides (respectant la syntaxe de SQL). Le plus simple serait peut-être de demander au programmeur Lisp de rentrer directement des requêtes SQL. Mais l'intérêt de cette solution paraît plus limité. Opérations : Voici quelques exemples d'opérations de base : (sqldb-connect db1) ; connexion à la base (sqldb-query (select nom :from 'clients)) ; envoi d'une requête (sqldb-close) ; deconnexion Environnement : Pour que le programmeur Lisp puisse récupérer facilement le résultat de sa requête, on crée un environnement with-result. Celui-ci place le résultat d'une requête dans une variable passée en paramètre. Il s'agit d'une macro assez simple à écrire. (with-result result query) --------------D76931C15B8C201DC483B490--  1,, Summary-line: 1-Mar thouveni@enseirb.fr [208] #Examen de langages enchasses X-Coding-System: nil Mail-from: From thouveni@enseirb.fr Thu Mar 1 14:08 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id OAA23040 for ; Thu, 1 Mar 2001 14:08:44 +0100 (MET) Received: from enseirb.fr (thouveni@narrhavas [147.210.18.145]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id OAA05071 for ; Thu, 1 Mar 2001 14:03:09 +0100 (MET) Sender: thouveni@enseirb.fr Message-ID: <3A9E48EE.4B1646A6@enseirb.fr> Date: Thu, 01 Mar 2001 14:04:46 +0100 From: Cyrille THOUVENIN Organization: ENSEIRB X-Mailer: Mozilla 4.7 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen de langages enchasses Content-Type: multipart/mixed; boundary="------------6632353B34567C9FB7200385" Content-Length: 5735 *** EOOH *** Sender: thouveni@enseirb.fr Date: Thu, 01 Mar 2001 14:04:46 +0100 From: Cyrille THOUVENIN Organization: ENSEIRB X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Examen de langages enchasses Content-Type: multipart/mixed; boundary="------------6632353B34567C9FB7200385" Content-Length: 5735 This is a multi-part message in MIME format. --------------6632353B34567C9FB7200385 Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: 7bit Ci-joint le fichier exam.txt qui sont les reponses aux questions et le fichier exam.lisp qui est une demonstration de la premiere question. Salutations distinguees -- Cyrille THOUVENIN - thouveni@enseirb.fr Etudiant ENSEIRB 3eme annee informatique (DEA) --------------6632353B34567C9FB7200385 Content-Type: text/plain; charset=iso-8859-2; name="exam.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exam.lisp" ;;;; -*- Mode: Lisp; Syntax: Common-Lisp -*- ;;;; Examination: Window buffering ;;;; THOUVENIN Cyrille, ENSEIRB, GLi3 (defmacro with-buffering (window &body body) (let ((window-save (gensym))) `(let ((,window-save ,window)) (setf ,window (create-pixmap ,window)) (and ,@body (copy-pixmap ,window ,window-save)) (destroy-pixmap ,window) (setf ,window ,window-save)))) (defmacro copy-pixmap (pixmap window) `(setf ,window (cons 'copy ,pixmap))) (defmacro destroy-pixmap (pixmap) `(setf ,pixmap nil)) (defun create-pixmap (window) `(pixmap)) (defmacro draw-rectangle (window) `(setf ,window (cons 'rectangle ,window))) (defmacro draw-circle (window) `(setf ,window (cons 'circle ,window))) (defmacro draw-fail () nil) (defun run-test-1 () (with-buffering *window* (draw-circle *window*) (draw-rectangle *window*) (draw-rectangle *window*))) (defun run-test-2 () (with-buffering *window* (draw-circle *window*) (draw-fail) (draw-rectangle *window*))) (macroexpand '(with-buffering *window* (draw-circle *window*) (draw-rectangle *window*) (draw-rectangle *window*))) (setf *window* '(triangle)) (run-test-1) (princ *window*) (setf *window* '(triangle)) (run-test-2) (princ *window*) --------------6632353B34567C9FB7200385 Content-Type: text/plain; charset=iso-8859-2; name="exam.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.txt" Examen de langages enchâssés Cyrille THOUVENIN, ENSEIRB, GLi3 Question 1: ----------- On suppose que les opérations graphiques renvoie nil si elles ont echoué. (defmacro with-buffering (window &body body) (let ((window-save (gensym))) `(let ((,window-save ,window)) (setf ,window (create-pixmap ,window)) (and ,@body (copy-pixmap ,window ,window-save)) (destroy-pixmap ,window) (setf ,window ,window-save)))) Voir le fichier exam.lisp pour une demonstration. Question 2: ----------- Nous voulons donc concevoir un langage enchâssé où le programmeur peut écrire des requêtes SQL de la manière la mieux intégrée dans Common Lisp. Ces requêtes SQL sont interprétés par le serveur de base de données Nous proposons dans un premier temps de permettre au programmeur d'écrire une requête de la forme: (SELECT nom,prenom FROM personne where age > 28) On peut améliorer la notation en permettant l'écriture: (SELECT (nom prenom) :FROM personne :WHERE (> age 28)) En ajoutant la connexion, on aurait la macro with-db suivante qui renvoie une liste d'enregistrement: (with-db *database* (SELECT (nom prenom) :FROM personne :WHERE (> age 28))) L'expansion de cette macro donnerait: (let ((#:G100 (CONNECT *database*))) (if #:G100 ; si la connection a réussi (progn (multiple-value-bind (#:G200 #:G201) (QUERY #:G100 "select nom,prenom from personne where age>28")) (DISCONNECT #:G842) (values #:G200 #:G201)) (values nil nil))) ;;; #:G200 contient nil si la requête échoue et #:G201 contient ;;; le résultat de la requête ou nil si aucun enregistrement ne ;;; satisfait la requête. Il faut une macro pour chaque type de requête SQL: SELECT, UPDATE, INSERT, DELETE, DROP-TABLE, CREATE-TABLE etc... Cependant, on voit bien les limites de cette approche lorsque l'on écrit la clause WHERE où l'on peut effectuer des calculs pour chaque ligne des tables en question. En effet, on pourrait utiliser des fonctions Lisp non présente dans SQL. Par exemple: (with-db *database* (SELECT (nom prenom voiture) :FROM (personne voiture) :WHERE (and (= personne.numvoiture voiture.numvoiture) (anagramme nom marque))) où anagramme est une fonction Lisp qui renvoie t si son premier paramètre est un anagramme du deuxième paramètre. On pourrait encore s'en sortir ici en envoyant la requête sans l'appelle à la fonction anagramme et effectué le filtrage dans l'environnement Lisp. Les macros créeraient alors la requête SQL qui effectuerait le maximum de calcul sur le serveur et ce qui n'est pas possible de réaliser en SQL serait fait ensuite. L'expansion de la macro produirait les requêtes nécessaire et le code Lisp supplémentaire pour finir le traitement qui n'a pas été réalisé en SQL, ce qui est déjà sophistiqué. Cela deviendrait inefficace pour les requêtes de la forme: (with-db *database* (SELECT (nom prenom voiture.marque) :FROM (personne voiture) :WHERE (anagramme personne.nom voiture.marque)) Il faut ici charger les deux table personne et voiture dans l'environnement Lisp et faire en Lisp la jointure. Bilan: On ne peut pas espérer proposer au programmeur la puissance de Lisp dans SQL. Ainsi, faire un langage enchâssé avec SQL est impossible. Ce que l'on peut faire c'est proposé au programmeur des macros with-db, select, update etc... en limitant les opérations possibles à celles supportées par SQL. Cela ne forme pas un langage enchâssé, puisque un langage enchâssé repose sur le langage hôte et permet donc l'utilisation des structures syntaxiques de ce langage hôte. --------------6632353B34567C9FB7200385--  1,, Summary-line: 1-Mar mestaoui@enseirb.fr [64] #examin de LE X-Coding-System: nil Mail-from: From mestaoui@enseirb.fr Thu Mar 1 14:19 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id OAA23442 for ; Thu, 1 Mar 2001 14:19:38 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id OAA06919 for ; Thu, 1 Mar 2001 14:14:03 +0100 (MET) Received: from tanit (mestaoui@localhost [127.0.0.1]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with SMTP id OAA28125 for ; Thu, 1 Mar 2001 14:14:36 +0100 (MET) Sender: mestaoui@enseirb.fr Message-ID: <3A9E4B3C.56DF@info.enserb.u-bordeaux.fr> Date: Thu, 01 Mar 2001 14:14:36 +0100 From: Mestaoui X-Mailer: Mozilla 3.01Gold (X11; I; SunOS 5.7 sun4u) MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: examin de LE Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exam.lisp" Content-Type: text/plain; charset=us-ascii; name="exam.lisp" Content-Length: 1732 *** EOOH *** Sender: mestaoui@enseirb.fr Date: Thu, 01 Mar 2001 14:14:36 +0100 From: Mestaoui To: strandh@labri.u-bordeaux.fr Subject: examin de LE Content-Disposition: inline; filename="exam.lisp" Content-Type: text/plain; charset=us-ascii; name="exam.lisp" Content-Length: 1732 ;; Examin de langages enchasses ;; MESTAOUI Sami 3eme annee GL ;;Question 1 (defmacro with-buffering (window &rest graphics-operations) (let ((saved_window (gensym))) ;;On cree une variable temporaire `(let ((,saved_window ,window));; On stocke la valeur de window dans la variable temporaire (pixmap (create-pixmap ,window));;on cree un pixmap (progn (setf ,window pixmap);;on stoke ce pixmap dans window ,@graphics-operations ;; on effectue le operations (copy-pixmap ,window ,saved_window) ;;on copie le pixmap dans la variable temporaire (destroy-pixmap ,window);on detruit le pixmap (setf ,window ,saved_window)))));en cas d'erreur dans les operations graphiques on remet dans window sa valeur initiale sinon en cas de succes window aura la nouvelle valeur apres les operations graphiques . (macroexpand '(with-buffering wind (op1 wind toto) (op2 wind titi))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Question 2 L'objectif de l'exercice est d'arriver a concevoir des macros qui prennent en argument une requete SQL de type (select * from table where ..., create table ..., drop table ..., insert into...)et de reecrire cette requete SQL en lisp dans un langage de requete semblable a celui qu'on a vue en cours en faisant appel a des fonctions de bas niveauqui communiquent avec la base notamment connexion, deconnexion,envoie de requete et recuperation des reponses . l'appel a ces macros sera comme ceci : (select-macro '(select name from Employee where age = "30")) (create-macro '(create table Entreprise)) (drop-macro '(drop table Employee)) Un environnement de travail utile pour l'application est with-connection qui permet d'identifier la base et d'ouvrir une connexion .  1,, Summary-line: 1-Mar mestaoui@enseirb.fr [64] #examin de LE X-Coding-System: nil Mail-from: From mestaoui@enseirb.fr Thu Mar 1 14:20 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id OAA23465 for ; Thu, 1 Mar 2001 14:20:20 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id OAA07030 for ; Thu, 1 Mar 2001 14:14:45 +0100 (MET) Received: from tanit (mestaoui@localhost [127.0.0.1]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with SMTP id OAA28201 for ; Thu, 1 Mar 2001 14:15:19 +0100 (MET) Sender: mestaoui@enseirb.fr Message-ID: <3A9E4B66.DF1@info.enserb.u-bordeaux.fr> Date: Thu, 01 Mar 2001 14:15:19 +0100 From: Mestaoui X-Mailer: Mozilla 3.01Gold (X11; I; SunOS 5.7 sun4u) MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: examin de LE Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exam.lisp" Content-Type: text/plain; charset=us-ascii; name="exam.lisp" Content-Length: 1732 *** EOOH *** Sender: mestaoui@enseirb.fr Date: Thu, 01 Mar 2001 14:15:19 +0100 From: Mestaoui To: strandh@labri.u-bordeaux.fr Subject: examin de LE Content-Disposition: inline; filename="exam.lisp" Content-Type: text/plain; charset=us-ascii; name="exam.lisp" Content-Length: 1732 ;; Examin de langages enchasses ;; MESTAOUI Sami 3eme annee GL ;;Question 1 (defmacro with-buffering (window &rest graphics-operations) (let ((saved_window (gensym))) ;;On cree une variable temporaire `(let ((,saved_window ,window));; On stocke la valeur de window dans la variable temporaire (pixmap (create-pixmap ,window));;on cree un pixmap (progn (setf ,window pixmap);;on stoke ce pixmap dans window ,@graphics-operations ;; on effectue le operations (copy-pixmap ,window ,saved_window) ;;on copie le pixmap dans la variable temporaire (destroy-pixmap ,window);on detruit le pixmap (setf ,window ,saved_window)))));en cas d'erreur dans les operations graphiques on remet dans window sa valeur initiale sinon en cas de succes window aura la nouvelle valeur apres les operations graphiques . (macroexpand '(with-buffering wind (op1 wind toto) (op2 wind titi))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Question 2 L'objectif de l'exercice est d'arriver a concevoir des macros qui prennent en argument une requete SQL de type (select * from table where ..., create table ..., drop table ..., insert into...)et de reecrire cette requete SQL en lisp dans un langage de requete semblable a celui qu'on a vue en cours en faisant appel a des fonctions de bas niveauqui communiquent avec la base notamment connexion, deconnexion,envoie de requete et recuperation des reponses . l'appel a ces macros sera comme ceci : (select-macro '(select name from Employee where age = "30")) (create-macro '(create table Entreprise)) (drop-macro '(drop table Employee)) Un environnement de travail utile pour l'application est with-connection qui permet d'identifier la base et d'ouvrir une connexion .  1,, Summary-line: 1-Mar guillero@enserb.fr [96] #Examen de Lisp X-Coding-System: nil Mail-from: From guillero@enserb.fr Thu Mar 1 14:58 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id OAA25101 for ; Thu, 1 Mar 2001 14:58:10 +0100 (MET) Received: from matho.enserb.u-bordeaux.fr (root@matho [147.210.18.2]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id OAA13635 for ; Thu, 1 Mar 2001 14:52:33 +0100 (MET) Received: from enserb.fr (guillero@localhost [127.0.0.1]) by matho.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id OAA14498 for ; Thu, 1 Mar 2001 14:54:11 +0100 (MET) Sender: guillero@enseirb.fr Message-ID: <3A9E5483.E47E3CB9@enserb.fr> Date: Thu, 01 Mar 2001 14:54:11 +0100 From: GUILLERON William X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examen de Lisp Content-Type: multipart/mixed; boundary="------------86E978F691DC707D7E5981FA" Content-Length: 2656 *** EOOH *** Sender: guillero@enseirb.fr Date: Thu, 01 Mar 2001 14:54:11 +0100 From: GUILLERON William X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Examen de Lisp Content-Type: multipart/mixed; boundary="------------86E978F691DC707D7E5981FA" Content-Length: 2656 This is a multi-part message in MIME format. --------------86E978F691DC707D7E5981FA Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Voici le compte-rendu de l'examen de Lisp distribue lundi 26 Fevrier -- Willyam Guilleron --------------86E978F691DC707D7E5981FA Content-Type: text/plain; charset=iso-8859-1; name="rendu.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="rendu.txt" Willyam Guilleron I3 Examen de Langages enchasses 1. Technique de tampons pour la mise à jour d'une fenêtre (defmacro with-buffering (window &body body) (let ((nouveau (gensym)) ; nouvelle fenetre (copie (gensym))) ; sauvegarde de l'ancienne fenetre `(let* ((,copy ,window) ; stockage de la valeur de la variable donnée en paramètre dans une variable locale (,window (create-pixmap ,window))) ; création d' un pixmap, stockage dans la variable window (progn ,@body) ; opérations graphiques (copy-pixmap ,window ,nouveau) ; copie du pixmap créé (destroy-pixmap ,window) ; destruction de ce pixmap (setf (,window ,copie)) ; la variable donnée reprend sa valeur initiale ,nouveau))) ; retour de la nouvelle fenetre 2. Il est possible de concevoir la definition d'une macro en Lisp capable d'interpreter des commandes SQL et ce, a partir de fonctions Lisp a definir. Elle serait en mesure de se connecter a la base de donnees dans l'intention de lui faire parvenir des requetes SQL via des fonctions Lisp. Voici qu'elle pourrait etre les fonctions lisp a definir - connect // connexion a la base de donnees - create // requete de creation de table - drop // requete de destruction d'une table - select // requete de lecture sur la base et retour de donnees - update // requete d'ecriture sur la base - disconnect // deconnexion Mais pour pouvoir parler de langage enchasse il faudrait pouvoir inclure des fonctions lisp a l'interieur meme des requetes. exemple : (defun select (....)) (defvar salleChoisie 13) (select 'ip 'nom :where '(= salle salleChoisie)) pour avoir le nom et l'ip de machines presentes dans une salle. Pour la connexion il serait necessaire de preciser en parametre de la fonction connect : la base (localisation et nom), le nom d'utilisateur pour acceder a la base ainsi que le mot de passe associe. Par ailleurs il serait interessant d'utiliser la formule (with-type_de_format) pour formater une reponse retournee a l'execution d'une commande select par exemple. --------------86E978F691DC707D7E5981FA--  1,, Summary-line: 1-Mar tranchan@enseirb.fr [109] #Examen de Langages Enchasses X-Coding-System: nil Mail-from: From tranchan@enseirb.fr Thu Mar 1 15:15 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id PAA25940 for ; Thu, 1 Mar 2001 15:15:35 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id PAA20081 for ; Thu, 1 Mar 2001 15:09:58 +0100 (MET) Received: from enseirb.fr (tranchan@zeppo [147.210.18.60]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id PAA18371 for ; Thu, 1 Mar 2001 15:10:32 +0100 (MET) Sender: tranchan@enseirb.fr Message-ID: <3A9E5874.6659F6C0@enseirb.fr> Date: Thu, 01 Mar 2001 15:11:00 +0100 From: TRANCHANT Ludovic X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: fr-FR, en MIME-Version: 1.0 To: Robert STRANDH Subject: Examen de Langages Enchasses Content-Type: multipart/mixed; boundary="------------82BD7EB4E477A20C7E8F03FC" Content-Length: 2982 *** EOOH *** Sender: tranchan@enseirb.fr Date: Thu, 01 Mar 2001 15:11:00 +0100 From: TRANCHANT Ludovic X-Accept-Language: fr-FR, en To: Robert STRANDH Subject: Examen de Langages Enchasses Content-Type: multipart/mixed; boundary="------------82BD7EB4E477A20C7E8F03FC" Content-Length: 2982 This is a multi-part message in MIME format. --------------82BD7EB4E477A20C7E8F03FC Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour, veuillez trouver ci-joint ma reponse a l'examen de Langages Enchasses. Ludovic Tranchant --------------82BD7EB4E477A20C7E8F03FC Content-Type: text/plain; charset=iso-8859-1; name="examen.txt" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="examen.txt" Examen de Langages Enchâssés Ludovic Tranchant ------------------------------------------------------------------- Question 1: Afin de pouvoir stocker la valeur de la variable passée en paramêtre, on utilise gensym. Pour assurer la validité du and lors de l'execution des opérations graphiques, il est nécessaire qu'elles retournent nil en cas d'erreur. (defmacro with-buffering (window &body body) (let ((pixmap-tmp (gensym))) ; crée un symbole `(let ((,pixmap-tmp ,window)) ; stocke la fenêtre dans le symbole (setf ,window (create-pixmap ,window)) ; crée le pixmap (and ,@body ; exécute les opérations graphiques (copy-pixmap ,window ,pixmap-tmp)) ; copie le résultat dans le pixmap temporaire (destroy-pixmap ,window) ; détruit le pixmap créé (setf ,window ,pixmap-tmp)))) ; "affiche" la nouvelle fenêtre ou restaure l'ancienne ------------------------------------------------------------------- Question 2: Afin de créer un langage enchâssépour SQL, il faudrait, pour chaque opération SQL (select, insert, update, etc...), implémenter une fonction CommonLisp qui construirait une requête SQL à partir des arguments passés à la fonction. Ces arguments pourront se présenter sous la forme de liste de paramêtres (par exemple pour pouvoir afficher plusieur champs lors d'un select), ou utiliser des macros, pour par exemple créer les conditions where d'un select (par exemple une macro where-and, where-equal, ...). De plus une macro devra être prévue pour réutiliser les données résultant d'une requête imbriquée. Enfin, ces arguments doivent pouvoir être évalués afin de pouvoir utiliser des fonction lisp et ainsi permettre des calculs prélimininaires Ainsi on aurait: Pour la requête SQL "insert into Personnel values ("Jean" "Dupont" "Manager" 43), on aurait: (insert Personnel '("Jean" "Dupont" "Manager" 43)) Pour des insertions multiples: (insert Personnel ('(Jean Dupont Manager 43) '(Gérard Riviere Assistant 33))) La commande select contient trois paramêtres: la liste des champs à retourner, les tables où chercher ces champs, et la clause where. Ainsi l'appel suivant: (select '(Nom Prénom) Personnel (where-and (where-equal âge (+ 40 3)) (where-equal fonction Manager))) est équivalent à la requête SQL suivante: select Nom,Prénom from Personnel where âge=43 and fonction="Manager" L'environnement nécessaire est un environnement with-database permettant la connection à une base de données. --------------82BD7EB4E477A20C7E8F03FC--  1,, Summary-line: 1-Mar mrabet@enserb.fr [100] #Examin de Common Lisp X-Coding-System: nil Mail-from: From mrabet@enserb.fr Thu Mar 1 15:31 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id PAA26599 for ; Thu, 1 Mar 2001 15:31:19 +0100 (MET) Received: from tanit.enserb.u-bordeaux.fr (root@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id PAA23367 for ; Thu, 1 Mar 2001 15:25:41 +0100 (MET) Received: from enserb.fr (mrabet@localhost [127.0.0.1]) by tanit.enserb.u-bordeaux.fr (8.9.3/8.9.3) with ESMTP id PAA23174 for ; Thu, 1 Mar 2001 15:26:14 +0100 (MET) Sender: mrabet@enseirb.fr Message-ID: <3A9E5C06.B8373B6C@enserb.fr> Date: Thu, 01 Mar 2001 15:26:14 +0100 From: M RABET Mehdi X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: Examin de Common Lisp Content-Type: multipart/mixed; boundary="------------E4FC8B8ED4BA357ADB7A27D6" Content-Length: 2806 *** EOOH *** Sender: mrabet@enseirb.fr Date: Thu, 01 Mar 2001 15:26:14 +0100 From: M RABET Mehdi X-Accept-Language: en To: strandh@labri.u-bordeaux.fr Subject: Examin de Common Lisp Content-Type: multipart/mixed; boundary="------------E4FC8B8ED4BA357ADB7A27D6" Content-Length: 2806 This is a multi-part message in MIME format. --------------E4FC8B8ED4BA357ADB7A27D6 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour, voici mon travail pour l'examin de lisp, je m'excuse pour le reatrd, je m'etais trompe dans l'adresse Cordialement Mehdi M'rabet --------------E4FC8B8ED4BA357ADB7A27D6 Content-Type: text/plain; charset=iso-8859-1; name="exam.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.lisp" ;; Examin de langages ecnchasses ;; M'RABET Mehdi 3eme annee GL ;; Question 1 (defmacro with-buffering (window &rest graphics-operations) (let ((saved_window (gensym))) `(let ((,saved_window ,window) (pixmap (create-pixmap ,window))) (progn (setf ,window pixmap) ,@graphics-operations (copy-pixmap ,window saved_window) (destroy-pixmap pixmap) (setf ,window ,saved_window))))) (macroexpand '(with-buffering graphic-window (operation1 graphic-window param1 param2) (operation2 graphic-window param))) ;; Question 2 Il s'agit ici de concevoir des fonctions et des macros en common lisp qui reprennent la syntaxe SQL. Il s'agit donc tout d'abord de développer les primitives nécessaires à la connexion à la base, à l'envoi de requêtes à la base, à la récupération des résultats et à leur affichage. On pourrait donc à l'aide de ces primitives avoir des macros du type: (select '(nom prenom) :from '(eleves) :where '(> age 10)) ;; l'écriture des équations de cette façon (lisp) permet d'éviter ;; les calculs inutiles pour re"parser" les expressions Ce qui est une syntaxe normale en lisp, subsistent quelques subtilites : - en cas de precisicion de la table on peut mettre par exemple (table attribut) pour pouvoir différencier on peut faire le test (list? (first args)) - en cas de clause where complexe. (select par exemple) un appel récursif résoudrait le problème. Exemples et opérations: (sql-query '(select '(nom prenom) :from '(eleves) :where '(> age 10)) 'my_database) ;; Avec my_database le paramètre permettant de lancer les primitives de connexion ;; et de déconnexion en début et fin de sql-query ;; (sql-connect my_database) ;; (let query (sql-interpret-query '(select '(nom prenom) :from '(eleves) :where '(> age 10)))) ;; (sql-do-query query my_database) cette primitive s'occuperait en même temps de l'affichage ;; (sql-disconnect my_database) Environnement: Selon l'implémentation que l'on choisit pour les primitives de bas niveau on peut choisir un environnement qui permet d'accéder aux bases distantes ou bien de manipuler des bases lisp "with-hash-table-iterator" comme l'exemple du cours, ou encore du stockage sur fichier "with-open-file". --------------E4FC8B8ED4BA357ADB7A27D6--  1,, Summary-line: 1-Mar senee@enseirb.fr [693] #examen Langage enchasse X-Coding-System: nil Mail-from: From senee@enseirb.fr Thu Mar 1 15:33 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id PAA26659 for ; Thu, 1 Mar 2001 15:33:05 +0100 (MET) Received: from enseirb.fr (senee@tanit [147.210.18.1]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id PAA23733 for ; Thu, 1 Mar 2001 15:27:26 +0100 (MET) Sender: senee@enseirb.fr Message-ID: <3A9E5C6F.B25953B1@enseirb.fr> Date: Thu, 01 Mar 2001 15:27:59 +0100 From: Laurent SENEE Organization: ENSEIRB X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: fr-FR, en MIME-Version: 1.0 To: strandh@labri.u-bordeaux.fr Subject: examen Langage enchasse Content-Type: multipart/mixed; boundary="------------22B5BDEF9E488418792BB9B7" Content-Length: 42338 *** EOOH *** Sender: senee@enseirb.fr Date: Thu, 01 Mar 2001 15:27:59 +0100 From: Laurent SENEE Organization: ENSEIRB X-Accept-Language: fr-FR, en To: strandh@labri.u-bordeaux.fr Subject: examen Langage enchasse Content-Type: multipart/mixed; boundary="------------22B5BDEF9E488418792BB9B7" Content-Length: 42338 This is a multi-part message in MIME format. --------------22B5BDEF9E488418792BB9B7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour, Je vous envoie mes fichiers comportant mes reponses. Laurent SENEE. --------------22B5BDEF9E488418792BB9B7 Content-Type: application/postscript; name="exam.ps" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exam.ps" %!PS-Adobe-2.0 %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software %%Title: exam.dvi %%Pages: 2 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentPaperSizes: a4 %%EndComments %DVIPSCommandLine: dvips exam.dvi -o exam.ps %DVIPSParameters: dpi=600, compressed, comments removed %DVIPSSource: TeX output 2001.03.01:1357 %%BeginProcSet: texc.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N /cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add /gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{ dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg} {adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{ adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{] }if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 39158280 55380996 1000 600 600 (exam.dvi) @start /Fa 14 118 df44 D<14F8EB07FE90381F871C90383E03FE137CEBF801120148486C5A485A120FEBC001001F 5CA2EA3F801403007F5C1300A21407485C5AA2140F5D48ECC1C0A2141F15831680143F15 87007C017F1300ECFF076C485B9038038F8E391F0F079E3907FE03FC3901F000F0222677 A42A>97 D<147F903803FFC090380FC1E090381F0070017E13784913383901F801F83803 F003120713E0120FD81FC013F091C7FC485AA2127F90C8FCA35A5AA45AA3153015381578 007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00380F81F83803FFE0C690C7FC1D2677 A426>99 DI<147F903803FFC090380FC1E090383F00F0017E13785B485A485A485A 120F4913F8001F14F0383F8001EC07E0EC1F80397F81FF00EBFFF891C7FC90C8FC5A5AA5 5AA21530007C14381578007E14F0003EEB01E0EC03C06CEB0F806CEB3E00380781F83803 FFE0C690C7FC1D2677A426>I105 D108 D110 D<147F903803FFC090380FC1F090381F00F8017E137C5B4848137E4848133E0007143F5B 120F485AA2485A157F127F90C7FCA215FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0 140F007C14C0007EEB1F80003EEB3F00147E6C13F8380F83F03803FFC0C648C7FC202677 A42A>I<9039078007C090391FE03FF090393CF0787C903938F8E03E9038787FC0017049 7EECFF00D9F0FE148013E05CEA01E113C15CA2D80003143FA25CA20107147FA24A1400A2 010F5C5E5C4B5A131F5EEC80035E013F495A6E485A5E6E48C7FC017F133EEC70FC90387E 3FF0EC0F8001FEC9FCA25BA21201A25BA21203A25B1207B512C0A3293580A42A>I<3903 C003F0390FF01FFC391E783C0F381C7C703A3C3EE03F8038383FC0EB7F80007815000070 1300151CD8F07E90C7FCEAE0FE5BA2120012015BA312035BA312075BA3120F5BA3121F5B A3123F90C9FC120E212679A423>114 D<14FE903807FF8090380F83C090383E00E04913 F00178137001F813F00001130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C 7F6D13807F010F13C01300143F141F140F123E127E00FE1480A348EB1F0012E06C133E00 705B6C5B381E03E06CB45AD801FEC7FC1C267AA422>II<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C 0038140F131F007815C01270013F131F00F0130000E015805BD8007E133FA201FE14005B 5D120149137EA215FE120349EBFC0EA20201131E161C15F813E0163CD9F0031338140700 01ECF07091381EF8F03A00F83C78E090393FF03FC090390FC00F00272679A42D>I E /Fb 50 122 df11 DI14 D16 D<127812FCA27E7EEA7F80121FEA0FC0EA07E0EA03F012001378133C13 1E13060F0F77B92A>18 D<133C137EA213FE1201EA03FC13F0EA07E0EA0FC0EA1F80EA1E 005A5A5A12C00F0F6FB92A>I<121C127FEAFF80A213C0A3127F121C1200A412011380A2 120313005A1206120E5A5A5A12600A1979B917>39 D<146014E0EB01C0EB0380EB070013 0E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA35AA65AB2127CA6 7EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB 00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C 133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131E A2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I< 121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A12 600A19798817>44 DI<121C127FEAFF80A5EA7F00121C090979 8817>I49 DI<121C127FEAFF80A5EA7F00 121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>58 D<1538A3157CA315FEA34A 7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A20270 7FEC6003A202C07F1501A2D901807F81A249C77F167FA20106810107B6FCA24981010CC7 121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D80FFC02071380B56C90B512 FEA3373C7DBB3E>65 D<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03 FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F48 48150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A312 3F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE0 5C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D 7BBA3C>67 DI I73 D76 DI79 D81 D83 D85 D<13101338137C13FE487E3803C780380783C0380F01E0381E00F04813780070131C4813 0E00401304170D77B92A>94 D97 DIIII<147E9038 03FF8090380FC1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D8 01F8C7FCB3AB487E387FFFF8A31C3B7FBA19>IIII 108 D<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903BF1C01F83803F3D0F F3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A3486C496C EB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3FFCECF03F9039F1C0 1F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB500C1B51280A32925 7EA42E>II<3903F01FE000FFEB7FF89038F1E07E9039F3801F803A07 F7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA3167FAA16FEA3ED01FC A26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E07E9038F0FFF8EC1F C091C8FCAB487EB512C0A328357EA42E>II<3807E01F00FFEB7FC09038E1E3E09038 E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A2487EB512F0A31C 257EA421>II<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801F8C7FCB215C0A938 00FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>IIIIII E /Fc 40 122 df<010F133C90381F807EA8013F13FE4A5AA4007FB612F0B712F8A4003F 15F03A007E01F800A5EBFE0301FC5BA6003FB612F0B712F8A46C15F03A01F807E000A300 03130F01F05BA86C486C5A25337DB22C>35 D38 D I<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F 5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F 12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C> I<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0 A214F01303A214F81301A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F 1480133F14005B13FE485A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I< EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14 E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB 07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>I44 D<007FB6FCB71280A46C150021067B9B2C>I<121FEA3F80 EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>I48 D50 D52 D<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E015F8819038FE03FE90 38F000FF01C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127EB4FC150F16C0 A248141F007EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C000114C06C6C 90C7FCEB0FF823347CB22C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7FC AE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>58 D<003FB612E04815F0B712F8A36C15F0CAFCA8007FB612F0B712F8A36C15F06C15E02514 7DA22C>61 D64 D<137013F812011203EA07F0EA0FE0EA1FC01380 EA3F00123E127E127CA212FC5AA4EAFF8013C013E0A2127FA2123FEA1FC0EA0F800D1B71 B82C>96 D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC381F800000 06C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5A A47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC2724 7CA32C>II<903803FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49 137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F 003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>IIIIII<1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8 007FB512FCB612FEA36C14FC1F3479B32C>I107 D<387FFFE0B57EA37EEA0003B3B3A5 007FB61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3F FCD87FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E013C0A301C013 80B33B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D2481A32C>I< 397FF01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC01F02807FEC00 0F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>II<397FF0 1FE039FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091380007F049EB 03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F913880 1FE09138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B 27367FA32C>I 114 D<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA36CEB00F0007F 140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007EC00FE007814 7F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E000F814803970 1FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8FCB1ED03C0ED 07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003FE0232E7EAD2C >I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D137F3900FE03FF 90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFCB514FE148314 016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E017C137CA2017E 13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035BA214FF6D90C7 FCA26D5A147C27247EA32C>II<3A3F FF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83EC87E0 90380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF80903807CF C0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FFFC1483 B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE148314816C010113FC3A 03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D5BA2 EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143EA214 7E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C5A6C 5AEA07E027367EA32C>I E /Fd 10 118 df<157815FC14031407141F14FF130F0007B5 FCB6FCA2147F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>49 DI<93380FFFC00303B6FC031F15E092B712FC0203D9 FC0013FF020F01C0010F13C0023F90C7000313F0DA7FFC02007F902601FFF0ED3FFE4949 6F7E49496F7F49496F7F4990C96C7F4948707F4948707F01FF854A177F48864849717EA2 4849711380A2481BC04A83481BE0A24A83481BF0A3481BF8A291CB7EA3B51AFCAF6C1BF8 A26E5FA36C1BF0A36C6D4D13E0A36C1BC06E5F6C1B806E5F6CDB01FE16006C6D902607FF 80495A4C13E06C6D013F6D495A017F91267F03F85C6D6C90277C00FC015B6D6C49D97E03 5B6D01806E485B6D6D48D91F8F5B6D01E0039F90C7FC6D01F06EB45A6DD9FCF85DDA3FFF 6E13F0020F6D4913C0020301FF90B5C8FC020091B512FC031F180C0303181EDB001FEBE3 FE93C7EA01FF74133E74137E7413FEF2F8077290B5FC1CFCA285A21CF8A2851CF07314E0 A27314C0731480731400735B9638007FF8F21FE0576A79D265>81 D<913803FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E49486D7E 4849130F48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212FFA490B8 FCA318E049CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6DEC0FC06C 6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A010015C002 1F49C7FC020113F034387CB63D>101 D<137F497E000313E0487FA2487FA76C5BA26C5B C613806DC7FC90C8FCADEB3FF0B5FCA512017EB3B3A6B612E0A51B547BD325>105 D110 D<913801FFE0021F13FE91B612C0010315F0010F9038807FFC903A1FFC 000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890C86C7EA24883A248 486F7EA3007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA26C5F6E147F6C5F 6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF807FFC6D90B55A01 0015C0023F91C8FC020113E03A387CB643>I<903903FFF00F013FEBFE1F90B7FC120348 EB003FD80FF81307D81FE0130148487F4980127F90C87EA24881A27FA27F01F091C7FC13 FCEBFFC06C13FF15F86C14FF16C06C15F06C816C816C81C681013F1580010F15C0130002 0714E0EC003F030713F015010078EC007F00F8153F161F7E160FA27E17E07E6D141F17C0 7F6DEC3F8001F8EC7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0D8F807148048C6 01F8C7FC2C387CB635>115 D<143EA6147EA414FEA21301A313031307A2130F131F133F 13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26DEC1F001580 6DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B020313802A4D7ECB34>II E /Fe 2 115 df101 D<3803E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F80 49C7FCA35BB2487EB512E0A31A217FA01E>114 D E /Ff 16 118 df<131F1480133F137FA2EBFF00485A485A5B485A485A138048C7FC123E123C5A12E012 4011126CC431>19 D<14FF010713E090381F81F890383E007C01FC133F4848EB1F804913 0F4848EB07C04848EB03E0A2000F15F0491301001F15F8A2003F15FCA390C8FC4815FEA5 4815FFB3A46C15FEA56D1301003F15FCA3001F15F8A26C6CEB03F0A36C6CEB07E0000315 C06D130F6C6CEB1F806C6CEB3F00013E137C90381F81F8903807FFE0010090C7FC28447C C131>48 D<143014F013011303131F13FFB5FC13E713071200B3B3B0497E497E007FB6FC A3204278C131>II 69 D76 D78 D<49B41303010FEBE007013F13F89039FE 00FE0FD801F8131FD807E0EB079F49EB03DF48486DB4FC48C8FC4881003E81127E82127C 00FC81A282A37E82A27EA26C6C91C7FC7F7FEA3FF813FE381FFFE06C13FE6CEBFFE06C14 FC6C14FF6C15C0013F14F0010F80010180D9001F7F14019138001FFF03031380816F13C0 167F163F161F17E000C0150FA31607A37EA36C16C0160F7E17806C151F6C16006C5D6D14 7ED8FBC05CD8F9F0495AD8F07C495A90393FC00FE0D8E00FB51280010149C7FC39C0003F F02B487BC536>83 D97 D101 D109 D<3901FC01FE00FF903807FFC091381E07F091383801F8000701707F0003EBE0002601FD C07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FEA32F2C7DAB36>I<39 03F803F000FFEB1FFCEC3C3EEC707F0007EBE0FF3803F9C000015B13FBEC007E153C01FF 13005BA45BB3A748B4FCB512FEA3202C7DAB26>114 D<90383FE0183901FFFC383907E0 1F78390F0003F8001E1301481300007C1478127800F81438A21518A27EA27E6C6C13006C 7E13FC383FFFE06C13FC6C13FF6C14C06C14E0C614F0011F13F81300EC0FFC140300C0EB 01FE1400157E7E153EA27EA36C143C6C147C15786C14F86CEB01F039F38003E039F1F00F 8039E07FFE0038C00FF01F2E7DAC26>I<1306A5130EA4131EA3133E137EA213FE120112 07001FB512F0B6FCA2C648C7FCB3A4150CAA017E131C017F1318A26D133890381F8030EC C070903807E0E0903801FFC09038007F001E3E7EBC26>II E /Fg 13 121 df<143E147F14FF5BA25BEB07FEEB0FFC14F8EB1FF0EB3FE0EB7FC01480EBFF00 485AEA03F85B485A485A485A48C7FC123E5A5A5A1260181A65E342>19 D69 D 97 D<4AB47E020F13F8023F13FE9139FF007F80D903FCEB07E0D907F0EB01F0D91FE0EB 007849488049488049C87E48485D4915FF00034B138048485CA2485AA2485AA2003F6F13 0049EC007C94C7FC127FA35B12FFAD127F7FA4123F7FA2001FEE01C07F000F16036D1680 12076C6C15076D160000015E6C6C151E6D6C5C6D6C5C6D6C5CD90FF8495AD903FCEB07C0 903A00FF803F8091263FFFFEC7FC020F13F80201138032417CBF3A>99 D<181EEF3FFEEE07FFA4EE000F1703A21701B3AAEDFF80020F13F8023F13FE9139FF803F 81903A03FC0007C14948EB01E1D91FE0EB00F94948147D4948143D49C8121F4848150F49 1507120348481503491501120F121F5BA2123F5B127FA45B12FFAD127F7FA3123FA27F12 1FA26C6C1503A26C6C150712036D150F6C6C151F0000163D137F6D6CECF9FF6D6CEB01F1 D90FF0D903C113C06D6CD90F81EBFF80D901FFEB7F019039007FFFFC021F13E002010100 91C7FC41657CE349>II103 DI108 DII<91 39FFE00180010FEBFC03017FEBFF073A01FF001FCFD803F8EB03EFD807E0EB01FF48487F 4848147F48C8123F003E151F007E150F127CA200FC1507A316037EA27E7F6C7E6D91C7FC 13F8EA3FFE381FFFF06CEBFF806C14F86C14FF6C15C06C6C14F0011F80010714FED9007F 7F02031480DA003F13C01503030013E0167F00E0ED1FF0160F17F86C15071603A36C1501 A37EA26C16F016037E17E06D14076DEC0FC06D1580D8FDF0141FD8F8F8EC7F00013E14FC 3AF01FC00FF80107B512E0D8E001148027C0003FF8C7FC2D417DBF34>115 D<007FB500C0010FB512E0A4C691C70003EBFC00D93FFE6E13E0D90FFC16807148C7FC01 075E6D6C4A5A6D6C5D6D6D495A606E6C495A6E6C49C8FC6E6C130E171E6E6C5B6E6C5B6E 6C5B5F913801FF016EEB83C092387FC780033F90C9FC16EFED1FFE6F5A6F5A826F7E6F7E 5D834B7F92380F3FE0ED1E1F033C7F9238380FF892387807FCEDF003DA01E07F4A486C7E 707F4A486D7E4AC7FC021E6E7E021C6E7E023C6E7E5C4A6E7E01016F7E49486E7E130701 0F6F7F013F83D9FFF04A7F00076D4A13FCB56C020FEBFFF8A4453E80BD46>120 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: a4 %%BeginPaperSize: a4 a4 %%EndSetup %%Page: 1 1 1 0 bop 1124 872 a Fg(Examen)43 b(de)h(langage)g(enc)l(hass)l(\023)-62 b(e)1600 1112 y Ff(Lauren)m(t)33 b(SEN)2169 1087 y(\023)2160 1112 y(EE)1665 1295 y(1)1714 1272 y Fe(er)1795 1295 y Ff(mars)f(2001)515 1653 y Fd(Question)45 b(1)515 1835 y Fc(\(defmacro)40 b(with-buffering)d(\(window)k(&body)h(body\))602 1934 y(\(let)g(\(\(window-copy)c(\(gensym\)\)\))689 2034 y(`\(let)k(\(\(,window-copy)37 b(,window\)\))820 2133 y(\(setf)k(,window)g(\(create-pixmap)d(,window\)\))820 2233 y(\(and)907 2333 y(,@body)907 2432 y(\(copy-pixmap)h(,window)h (,window-copy\)\))820 2532 y(\(destroy-pixmap)d(,window\))820 2632 y(\(setf)k(,window)g(,window-copy\)\)\)\))515 2814 y Fb(On)33 b(supp)r(ose)g(que)g(les)g(fonctions)g(du)h(t)n(yp)r(e)g Fc(\(graphics-opera)o(tio)o(n)j(*windows)k(...\))515 2914 y Fb(ren)n(v)n(oie)24 b Fa(nil)i Fb(en)g(cas)e(d'erreur.)h(Ainsi,) h(le)g Fc(copy-pixmap)21 b Fb(n'est)26 b(pas)f(e\013ectu)n(\023)-39 b(e)25 b(en)h(cas)f(d'er-)515 3013 y(reur,)i(et)g(donc)h(la)f(copie)g (de)h(la)f(v)-5 b(ariable)27 b(initiale)g(n'est)h(pas)f(mo)r(di\014)n (\023)-39 b(ee.)515 3288 y Fd(Question)45 b(2)639 3470 y Fb(On)30 b(souhaite)e(concev)n(oir)g(un)i(langage)d(enc)n(hasse)i(p)r (our)g(SQL,)g(qui)h(presen)n(terait)e(une)515 3569 y(in)n(tegration)e (naturelle)h(du)h(SQL)f(dans)h(le)f(langage)f(de)i(base)f(Common)g (Lisp.)639 3669 y(On)41 b(p)r(ourra)-9 b(^)-32 b(\020t)39 b(a)n(v)n(oir)f(une)j(macro)f Fa(sele)l(ct)h Fb(qui)f(serait)g(de)h(la) g(m)n(^)-39 b(eme)40 b(forme)g(qu'une)515 3769 y(requ)n(^)-39 b(ete)26 b(de)h(t)n(yp)r(e)h Fa(sele)l(ct)g Fb(en)f(SQL.)g(Cette)h (macro)e(e\013ectuerait)i(la)f(connexion)f(\022)-42 b(a)28 b(la)f(base,)515 3868 y(en)n(v)n(errait)38 b(la)i(requ)n(^)-39 b(ete,)38 b(r)n(\023)-39 b(ecup)n(\022)g(ererait)37 b(la)i(r)n(\023)-39 b(ep)r(onse,)39 b(et)h(ferait)g(la)f(d)n(\023)-39 b(econnexion.)39 b(Cette)515 3968 y(macro)26 b(utiliserait)h(des)h(mots-cl)n(\023)-39 b(es)25 b(et)j(aurait)f(le)h(protot)n(yp)r(e)e(suiv)-5 b(an)n(t)14 b(:)639 4068 y Fc(select)41 b(&rest)h(selections)d(&key)j (from)g(where)g(order-by)p Fb(.)515 4167 y(Un)28 b(exemple)f(d'app)r (el)h(serait)13 b(:)639 4267 y Fc(\(select)41 b('nom)h('prenom)f(:from) g('personnes)f(:where)h('\(=)h(age)g(24\)\))515 4366 y Fb(qui)27 b(corresp)r(ond)f(\022)-42 b(a)28 b(la)f(requ)n(^)-39 b(ete)26 b(SQL)13 b(:)639 4466 y Fc(select)41 b(nom,)h(prenom)f(from)h (personnes)e(where)i(age=24)639 4566 y Fb(Des)31 b(macros)e(de)h(m)n(^) -39 b(eme)30 b(genre)g(sera)-9 b(^)-32 b(\020en)n(t)28 b(r)n(\023)-39 b(ealis)n(\023)g(ees)27 b(p)r(our)j(les)g(requ)n(^)-39 b(etes)29 b(t)n(yp)r(e)i Fa(insert,)515 4665 y(cr)l(e)l(ate,)42 b(up)l(date,)g(dr)l(op,)g(delete)f Fb(Cep)r(endan)n(t)g(une)f (limitation)g(\022)-42 b(a)40 b(ce)g(genre)f(de)i(requ)n(^)-39 b(ete)515 4765 y(ne)40 b(constitue)g(pas)f(un)i(langage)d(enc)n(hass)n (\023)-39 b(e,)37 b(et)k(il)f(su\016rait)f(d')n(\023)-39 b(ecrire)38 b(la)i(requ)n(^)-39 b(ete)38 b(dans)515 4865 y(une)28 b(simple)g(c)n(ha)-9 b(^)-32 b(\020ne)27 b(de)h(caract)n(\022) -39 b(eres.)24 b(Il)29 b(faudrait)e(p)r(ouv)n(oir)g(utiliser)h(des)g (fonctions)f Fa(lisp)i Fb(\022)-42 b(a)1926 5255 y(1)p eop %%Page: 2 2 2 1 bop 515 523 a Fb(l'in)n(t)n(\023)-39 b(erieur)28 b(de)h(la)g(requ)n(^)-39 b(ete.)29 b(Mais)g(ces)g(fonctions)g(ne)h (sera)-9 b(^)-32 b(\020en)n(t)27 b(applicables)i(que)g(sur)g(des)515 623 y(v)-5 b(ariables)26 b(de)i(l'en)n(vironnemen)n(t)e(de)i(l'app)r (el)g(de)g(la)f(requ)n(^)-39 b(ete.)26 b(Exemple)13 b(:)515 789 y Fc(\(defvar)40 b(*age*)i(50\))515 888 y(\(select)e('nom)i ('prenom)f(:from)h('personnes)d(:where)i('\(=)h(age)h(*age*\)\)#)515 1054 y Fb(La)27 b(requ)n(^)-39 b(ete)26 b(est)i(alors)e(analys)n(\023) -39 b(ee)25 b(a)n(v)-5 b(an)n(t)26 b(l'en)n(v)n(oie)h(au)g(syst)n(\022) -39 b(eme)27 b(de)g(base)g(de)h(donn)n(\023)-39 b(ee.)639 1154 y(On)24 b(p)r(ourrait)f(a)n(v)n(oir)e(b)r(esoin)j(d'un)g(en)n (vironnemen)n(t)f(qui)h(formate)f(une)h(r)n(\023)-39 b(ep)r(onse)22 b(\022)-42 b(a)24 b(une)515 1254 y(requ)n(^)-39 b(ete)36 b(donn)n(\023)-39 b(ee)36 b(suiv)-5 b(an)n(t)38 b(un)g(format)f(donn)n(\023)-39 b(e)36 b(en)i(param)n(\022)-39 b(etre)11 b(:)38 b(\(with-format)g(format)515 1353 y(requ)n(^)-39 b(ete\))1926 5255 y(2)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF --------------22B5BDEF9E488418792BB9B7 Content-Type: text/plain; charset=iso-8859-1; name="exam.lisp" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="exam.lisp" ;;; Examen de Langage enchasse ;;; SENEE Laurent ;;; Question 1 (defmacro with-buffering (window &body body) (let ((window-copy (gensym))) `(let ((,window-copy ,window)) (setf ,window (create-pixmap ,window)) (and ,@body (copy-pixmap ,window ,window-copy)) (destroy-pixmap ,window) (setf ,window ,window-copy)))) ;;;Question 2 ; On souhaite concevoir un langage enchasse pour SQL, qui presenterait une integration ; naturelle du SQL dans le langage de base Common Lisp. ; On pourraît avoir une macro select qui serait de la même forme ; qu'une requête de type select en SQL. Cette macro effectuerait la ; connexion à la base, enverrait la requête, récupèrerait la réponse, et ; ferait la déconnexion. Cette macro utiliserait des mots-clés et aurait ; le prototype suivant~: ; select &rest selections &key from where order-by ; Un exemple d'appel serait : ; (select 'nom 'prenom :from 'personnes :where '(= age 24)) ; ; qui correspond à la requête SQL : ; select nom, prenom from personnes where age=24 ; Des macros de même genre seraîent réalisées pour les requêtes type: ; insert, create, update, drop, delete ; Cependant une limitation à ce genre de requête ne constitue pas un ; langage enchassé, et il suffirait d'écrire la requête dans une simple ; chaîne de caractères. Il faudrait pouvoir utiliser des fonctions ; lisp à l'intérieur de la requête. Mais ces fonctions ne seraîent ; applicables que sur des variables de l'environnement de l'appel de la ; requête. Exemple~: ; (defvar *age* 50) ; (select 'nom 'prenom :from 'personnes :where '(= age *age*))# ; La requête est alors analysée avant l'envoie au système de base de donnée. ; On pourrait avoir besoin d'un environnement qui formate une réponse à ; une requête donnée suivant un format donné en paramètre~: ; (with-format format requête) --------------22B5BDEF9E488418792BB9B7--  1,, Summary-line: 1-Mar lehmann@enseirb.fr [100] #exam LE X-Coding-System: nil Mail-from: From lehmann@enseirb.fr Thu Mar 1 16:19 MET 2001 Received: from neouvielle.enseirb.fr (root@neouvielle.enseirb.fr [147.210.18.138]) by batman.labri.u-bordeaux.fr (8.8.7/8.8.7) with ESMTP id QAA28971 for ; Thu, 1 Mar 2001 16:19:20 +0100 (MET) Received: from enseirb.fr (lehmann@spendius [147.210.18.14]) by neouvielle.enseirb.fr (8.9.3/8.9.3) with ESMTP id QAA09303 for ; Thu, 1 Mar 2001 16:13:40 +0100 (MET) Sender: lehmann@enseirb.fr Message-ID: <3A9E67A1.FAECB8BE@enseirb.fr> Date: Thu, 01 Mar 2001 16:15:45 +0100 From: Ghislaine LEHMANN X-Mailer: Mozilla 4.6 [en] (X11; I; SunOS 5.7 sun4u) X-Accept-Language: en MIME-Version: 1.0 To: strandh@labri.fr Subject: exam LE Content-Type: multipart/mixed; boundary="------------C2B91914F5CBBC4D518688E3" Content-Length: 2246 *** EOOH *** Sender: lehmann@enseirb.fr Date: Thu, 01 Mar 2001 16:15:45 +0100 From: Ghislaine LEHMANN X-Accept-Language: en To: strandh@labri.fr Subject: exam LE Content-Type: multipart/mixed; boundary="------------C2B91914F5CBBC4D518688E3" Content-Length: 2246 This is a multi-part message in MIME format. --------------C2B91914F5CBBC4D518688E3 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bonjour Monsieur, Veuillez trouver ci joint mon fichier pour l'examen de langages enchasses. Avec toutes mes excuses pour le retard... je croyais que c'etait pour la fin de journee. Cordialement, Ghislaine LEHMANN --------------C2B91914F5CBBC4D518688E3 Content-Type: text/plain; charset=us-ascii; name="examen.lisp" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="examen.lisp" ;; Examen de langages enchasses ;; Ghislaine LEHMANN ;; Q.1 (defun create-pixmap (window) (format t "Creation du pixmap ") 'win) ;; pour affectation dans la macro et eviter un message d'erreur (defun copy-pixmap (pixmap window) (format t "Copie du pixmap")) (defun destroy-pixmap (pixmap) (format t "Destruction du pixmap ")) (defmacro with-buffering (window &rest operations) (let ((param (gensym))) `(let ((,param ,window)) ;; stockage de la valeur initiale (set ,window (create-pixmap ,window)) ;; stockage et creation simultanes (progn ,@operations) (copy-pixmap ,window ,param) (destroy-pixmap ,window) (set ,window ,param)))) (macroexpand '(with-buffering '*window* '(graphics-operation-1 *window*) '(graphic-operation-2 *window*))) ;; Q.2 ;; ;;Nous avons besoin de fonctions realisant les operation de base de SQL: select create delete alter insert update... ;; ;;ex: ;; ;;(defun sql-insert (table &body attributs) "implementation") ;; ;;-> utilisation: (sql-insert matable (att1 att2 att3)) ;; ;;Ces fonctions se chargent de "traduire" la commande en requete SQL a partir de l'evaluation des parametres qui peuvent eventuellement etre des fonctions lisp (*), elles gerent ensuite l'interfacage de bas niveau puis retournent un resultat sous forme de liste. ;; ;;(*) ex: (sql-select nom personne (= age (if (< unevariable 45) 23 24))) ;; => la fonction lisp "if" est d'abord evaluee ;; et ca se traduirait en: select nom from personne where age=24 ;; ;; ;;une macro with-database qui permette de selectionner la base avac laquelle on travaille pourrait etre utile. --------------C2B91914F5CBBC4D518688E3--