%--------------------------------
\begin{slide}\ti{Techniques et Fondements de la Programmation}
6 900 3975 10875 5700
4 0 0 100 0 18 18 0.0000 4 270 1245 900 4200 Planning:
4 0 0 100 0 18 18 0.0000 4 210 1695 5100 4200 13 semaines 
4 0 0 100 0 18 18 0.0000 4 270 5715 5100 4545 (12 semaines de cours, 12 semaines de TD)
4 0 0 100 0 18 18 0.0000 4 270 4740 5100 5235 2h de cours + 2h de TD par semaine
4 0 0 100 0 18 18 0.0000 4 270 4635 5100 5580 4h de travail individuel par semaine
-6
6 5100 2625 7200 3600
4 0 0 100 0 18 18 0.0000 4 210 2055 5100 2850 Pierre Castéran
4 0 0 100 0 18 18 0.0000 4 270 2055 5100 3195 Philippe Narbel
4 0 0 50 0 18 18 0.0000 4 270 1170 5100 3540 Oliver Ly
-6
6 900 5925 9975 6225
4 0 0 100 0 18 18 0.0000 4 270 2415 900 6150 Support de cours:
4 0 0 100 0 18 18 0.0000 4 270 4860 5100 6150 Paul Graham, ANSI Common Lisp, ou
-6
4 1 0 100 0 18 24 0.0000 4 360 3405 6600 1335 (partie Techniques)
4 0 0 100 0 18 18 0.0000 4 270 3000 900 2100 Responsable et cours:
4 0 0 100 0 18 18 0.0000 4 210 2025 5100 2100 Robert Strandh
4 0 0 100 0 18 18 0.0000 4 210 465 900 2850 TD:
4 0 0 50 0 18 18 0.0000 4 270 7005 5100 6750 David Touretzky, Common Lisp: A Gentle introcution 
4 0 0 100 0 18 18 0.0000 4 270 3330 5100 7125 to Symbolic Computation
4 0 0 50 0 18 18 0.0000 4 270 1740 5100 7815 Transparents
4 0 0 100 0 18 18 0.0000 4 270 11115 900 9000 Web: http://dept-info.labri.u-bordeaux.fr/~strandh/Teaching/TFP/2000-2001/Dir.html
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Bibliographie}
4 0 0 0 0 18 20 0.0000 4 210 1845 1200 2100 Paul Graham:
4 0 0 0 0 18 20 0.0000 4 270 2220 3300 7500 Addison Wesley
4 0 0 0 0 18 20 0.0000 4 270 4275 3300 6900 A programmer's guide to CLOS
4 0 0 0 0 18 20 0.0000 4 270 6465 3300 6600 Object-Oriented Programming in Common Lisp
4 0 0 0 0 18 20 0.0000 4 270 1905 1200 6000 Sonya Keene:
4 0 0 0 0 18 20 0.0000 4 210 1725 3300 5100 Prentice Hall
4 0 0 0 0 18 20 0.0000 4 270 5460 3300 4500 Advanced Techniques for Common Lisp
4 0 0 0 0 18 20 0.0000 4 270 1050 3300 4200 On Lisp
4 0 0 0 0 18 20 0.0000 4 210 1845 1200 3600 Paul Graham:
4 0 0 0 0 18 20 0.0000 4 270 2670 3300 2400 ANSI Common Lisp
4 0 0 0 0 18 20 0.0000 4 210 1725 3300 3000 Prentice Hall
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Autres documents}
4 0 0 0 0 18 20 0.0000 4 270 1575 1200 2100 Guy Steele:
4 0 0 0 0 18 20 0.0000 4 270 6075 3000 2700 Common Lisp, the Language, second edition
4 0 0 0 0 18 20 0.0000 4 270 1740 3000 3300 Digital Press
4 0 0 0 0 18 20 0.0000 4 270 4260 3000 3900 (disponible sur WWW en HTML)
4 0 0 0 0 18 20 0.0000 4 270 2790 1200 4800 CMUCL user's guide
4 0 0 0 0 18 20 0.0000 4 210 3000 1200 5700 CLX reference manual
4 0 0 0 0 18 20 0.0000 4 270 9420 1200 6600 The HyperSpec (la norme ANSI complète de Common Lisp, en HTML)
4 0 0 100 0 18 18 0.0000 4 210 1995 1200 7500 David Lamkins:
4 0 0 100 0 18 18 0.0000 4 270 4620 3000 8100 Successful Lisp (Tutorial en-ligne)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Objectifs et contenu}
4 0 0 100 0 18 18 0.0000 4 270 1170 900 2100 Objectif:
4 0 0 100 0 18 18 0.0000 4 270 7395 2700 2100 Maîtriser un certain nombre de méthodes et techniques 
4 0 0 100 0 18 18 0.0000 4 210 1230 900 3300 Contenu:
4 0 0 100 0 18 18 0.0000 4 270 7785 2700 2445 de programmation symbolique, impérative et fonctionnelle.
4 0 0 100 0 18 18 0.0000 4 270 3060 2700 3300 Langage Common Lisp
4 0 0 100 0 18 18 0.0000 4 270 3150 2700 3900 Types: symbole, liste, ...
4 0 0 100 0 18 18 0.0000 4 210 2475 2700 4500 Fonctions de base
4 0 0 100 0 18 18 0.0000 4 210 975 2700 5700 Macros
4 0 0 100 0 18 18 0.0000 4 270 1470 2700 6300 Exceptions
4 0 0 100 0 18 18 0.0000 4 270 4980 2700 6900 Programmation par objets avec CLOS
4 0 0 100 0 18 18 0.0000 4 270 5895 2700 5100 Techniques élémentaires de programmation 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{But de l'enseignement de programmation}
4 0 0 100 0 18 18 0.0000 4 270 9390 1200 3000 Langages, mécanismes et outils adaptés à ces méthodes et techniques
4 1 0 0 0 18 24 0.0000 4 360 7770 6600 4275 Aspects de la programmation non enseignés
4 0 0 100 0 18 18 0.0000 4 210 2370 1200 5400 Efficacité extrème
4 0 0 100 0 18 18 0.0000 4 270 1470 1200 6090 Temps réel
4 0 0 100 0 18 18 0.0000 4 270 7950 1200 6780 Applications particulières (jeux, image & son, numérique, ...)
4 0 0 100 0 18 18 0.0000 4 270 9015 1200 1800 Méthodes et techniques pour l'écriture d'applications maintenables,
4 0 0 100 0 18 18 0.0000 4 270 4185 1200 7470 Détails de langages particuliers
4 0 0 100 0 18 18 0.0000 4 270 3825 1200 8160 Impémentations particulières
4 0 0 100 0 18 18 0.0000 4 270 7170 1200 2145 réutilisables, lisibles, modulaires, générales, élégants.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Comment faire pour apprendre à programmer?}
4 0 0 100 0 18 18 0.0000 4 270 7470 1200 1800 Il faut surtout lire beacoup de code écrit par des experts
4 0 0 100 0 18 18 0.0000 4 270 9015 1200 2490 Il faut lire la litterature sur la programmation.  Il n'y en a pas beacoup
4 0 0 100 0 18 18 0.0000 4 270 2730 1200 2835 (peut-être 10 livres).
4 0 0 100 0 18 18 0.0000 4 270 2430 1200 3525 Il faut programmer
4 0 0 100 0 18 18 0.0000 4 270 7020 1200 4215 Il faut maintenir du code écrit par d'autres personnes
4 0 0 100 0 18 18 0.0000 4 270 4935 1200 4905 Il faut apprendre à être bien organisé
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Pourquoi le langage Common Lisp?}
4 0 0 100 0 18 18 0.0000 4 270 2475 1200 1800 Langage très riche
4 0 0 100 0 18 18 0.0000 4 270 3555 1200 2490 Syntaxe simple et uniforme
4 0 0 100 0 18 18 0.0000 4 270 4095 1200 3180 Sémantique simple et uniforme
4 0 0 100 0 18 18 0.0000 4 270 6450 1200 3870 Langage programmable (macros, reader macros)
4 0 0 100 0 18 18 0.0000 4 270 7740 1200 4560 Représentation de programmes sous la forme de données
4 0 0 100 0 18 18 0.0000 4 270 4875 1200 5250 Normalisé par ANSI, y compris CLOS
4 0 0 100 0 18 18 0.0000 4 270 8985 1200 5940 Programmation par objets plus puissante qu'avec d'autres langages
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition:  langage interprété}
4 1 0 0 0 18 24 0.0000 4 360 4815 6600 1335 (deux définitions possibles)
4 0 0 0 0 18 20 0.0000 4 270 7365 1200 3090 2.  Un langage forcement implémenté par un interprète
4 0 0 0 0 18 20 0.0000 4 270 7650 1200 2400 1.  Un langage pouvant être implémenté par un interprète
4 0 0 0 0 18 20 0.0000 4 270 9675 1200 5100 Si 1, alors tous les langages sont interprétés.  Si 2, alors aucun langage
4 0 0 0 0 18 20 0.0000 4 270 2190 1200 5445 n' est interprété.
4 0 0 0 0 18 20 0.0000 4 270 5940 1200 6480 Alors, "langage interprété"  n'a pas de sens.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Historique de Common Lisp}
4 0 0 0 0 18 20 0.0000 4 270 6735 1200 2100 Langage inventé à MIT par John McCarthy en 1959
4 0 0 0 0 18 20 0.0000 4 270 8835 1200 2445 (donc avec Fortran l'un des plus vieux langages toujours utilisés)
4 0 0 0 0 18 20 0.0000 4 270 7875 1200 3135 Dans les années 1970, deux dialectes:  Interlisp et Maclisp
4 0 0 0 0 18 20 0.0000 4 270 7275 1200 3825 Aussi:  Standard Lisp, NIL, Lisp Machine Lisp, Le Lisp
4 0 0 0 0 18 20 0.0000 4 270 7155 1200 4515 Travail pour uniformizer les dialectes:  Common Lisp
4 0 0 0 0 18 20 0.0000 4 270 3765 1200 5205 Normalisé par ANSI en 1987
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Processus de standardisation de Common Lisp}
4 0 0 0 0 18 20 0.0000 4 270 4995 1200 2400 1. Introduction d'un concept nouveau
4 0 0 0 0 18 20 0.0000 4 210 6810 1200 3090 2. Distribution sous la forme de fonctions+macros
4 0 0 0 0 18 20 0.0000 4 270 8355 1200 3780 3. Utilisation par les programmeurs pendant plusieurs années
4 0 0 0 0 18 20 0.0000 4 270 5850 1200 4470 4. Proposition de normalisation du concept
4 0 0 0 0 18 20 0.0000 4 270 5475 1200 5160 5. Intregration du concept dans la norme
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Tour guidé de Common Lisp}
4 0 0 0 0 18 20 0.0000 4 270 2775 1200 1800 Langage dynamique
4 0 0 0 0 18 20 0.0000 4 270 4815 1200 2490 Sémantique par référence uniforme
4 0 0 0 0 18 20 0.0000 4 270 4845 1200 3180 Gestion automatique de la mémoire
4 0 0 0 0 18 20 0.0000 4 270 2520 1200 3870 Types de données
4 0 0 0 0 18 20 0.0000 4 270 3855 2100 4500 Entiers à précision arbitraire
4 0 0 0 0 18 20 0.0000 4 210 1350 2100 4845 rationnels
4 0 0 0 0 18 20 0.0000 4 210 1125 2100 5190 flottants
4 0 0 0 0 18 20 0.0000 4 270 2940 2100 5535 complexes rationnels
4 0 0 0 0 18 20 0.0000 4 270 5340 6300 5550 la plupart des opérations arithmetiques
4 0 0 0 0 18 20 0.0000 4 270 3855 6300 5850 marchent sur les complexes
4 0 0 0 0 18 20 0.0000 4 270 2715 2100 5850 complexes flottants
4 0 0 0 0 18 20 0.0000 4 270 1350 2100 6195 symboles
4 0 0 0 0 18 20 0.0000 4 210 1455 2100 6540 caractères
4 0 0 0 0 18 20 0.0000 4 210 3015 2100 6885 chaînes de caractères
4 0 0 0 0 18 20 0.0000 4 270 1500 2100 7230 séquences
4 0 0 0 0 18 20 0.0000 4 210 735 2700 7500 listes
4 0 0 0 0 18 20 0.0000 4 210 1170 2700 7845 tableaux
4 0 0 0 0 18 20 0.0000 4 210 2175 4230 7845 tableaux de bits
4 0 0 0 0 18 20 0.0000 4 270 2670 6900 7845 tableaux d'hachage
4 0 0 0 0 18 20 0.0000 4 210 1290 2100 8190 fonctions
4 0 0 0 0 18 20 0.0000 4 195 1380 2100 8535 structures
4 0 0 0 0 18 20 0.0000 4 255 2955 2100 8880 classes, métaclasses
4 0 0 0 0 18 20 0.0000 4 210 840 2100 9225 séries
4 0 0 0 0 18 20 0.0000 4 270 3930 3630 9225 générateurs/consommateurs
4 0 0 0 0 18 20 0.0000 4 210 615 2100 9570 flots
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Tour guidé de Common Lisp}
4 1 0 0 0 18 24 0.0000 4 360 1110 6600 1335 (suite)
4 0 0 0 0 18 20 0.0000 4 210 3030 1200 2415 Structures de contr\364le
4 0 0 0 0 18 20 0.0000 4 270 5880 2115 3015 conditionnels (if, when, unless, cond, case)
4 0 0 0 0 18 20 0.0000 4 210 1410 2115 3360 récursivité
4 0 0 0 0 18 20 0.0000 4 270 4290 2115 3705 iteration (while, do, dolist, loop)
4 0 0 0 0 18 20 0.0000 4 270 5190 2115 4050 blocs (prog1, progn, tagbody, let, let*)
4 0 0 0 0 18 20 0.0000 4 210 1485 2115 4395 fermétures
4 0 0 0 0 18 20 0.0000 4 270 2895 2115 4740 fonctions génériques
4 0 0 0 0 18 20 0.0000 4 270 2295 2115 5085 valeurs multiples
4 0 0 0 0 18 20 0.0000 4 270 1515 2115 5430 exceptions
4 0 0 0 0 18 20 0.0000 4 270 4845 1200 6015 Mots clés (passage de paramètres)
4 0 0 0 0 18 20 0.0000 4 270 1650 1200 6705 Compilation
4 0 0 0 0 18 20 0.0000 4 210 1020 1200 7395 Macros
4 0 0 0 0 18 20 0.0000 4 270 4230 1200 8085 Programmation orientée objets
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Standards de codage}
4 0 0 0 0 18 20 0.0000 4 270 5730 1215 2100 Il faut s'habituer aux standards de codage
4 0 0 0 0 18 20 0.0000 4 270 7905 1215 2790 Pour Common Lisp, suivre les exemples dans la littérature
4 0 0 0 0 18 20 0.0000 4 270 10020 1215 3480 En particulier pour l'indentation de programmes qui est très standardisée.
4 0 0 0 0 18 20 0.0000 4 270 8310 1215 3825 Il faut pouvoir comprendre le programme sans regarder les ()
4 0 0 0 0 18 20 0.0000 4 270 4635 1215 4170 Utiliser lisp-mode de GNU Emacs
4 0 0 0 0 18 20 0.0000 4 270 8220 1215 4860 L'indentation n'est donc pas une question de go\373t personnel
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Programmation fonctionnelle}
4 0 0 0 0 18 20 0.0000 4 270 10245 1215 2085 Common Lisp est un langage mixte (fonctionnelle, impératif, orienté objets)
4 0 0 0 0 18 20 0.0000 4 270 10380 1200 3000 Pour un bon résultat, utiliser la programmation fonctionnelle le plus possible
4 0 0 0 0 18 20 0.0000 4 270 9615 1200 3900 Par programmation fonctionnelle, il faut comprendre la programmation
4 0 0 50 0 18 20 0.0000 4 210 2670 1200 4245 sans effets de bord
4 0 0 0 0 18 20 0.0000 4 270 5745 1200 5100 Les programmes sont plus faciles à tester
4 0 0 0 0 18 20 0.0000 4 270 5550 1200 6000 Programmation ascendente (bottom-up)
4 0 0 0 0 18 20 0.0000 4 270 7110 1200 6900 Paramètres sont souvent des fonctions (fermétures)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Sémantique par référence uniforme}
4 0 0 100 0 18 20 0.0000 4 270 7155 1215 2100 Manipulation d'objets par des références (pointeurs)
4 0 0 100 0 18 20 0.0000 4 270 9630 1215 2790 Le compilateur peut remplacer une référence par l'objet correspondant
4 0 0 100 0 18 20 0.0000 4 270 4935 1215 3135 si cela ne change pas la sémantique
4 0 0 100 0 18 20 0.0000 4 270 7305 1215 3825 Implementation d'objets typés par le marquage (tags)
4 0 0 100 0 18 20 0.0000 4 270 9780 1215 4515 Les petits objets (fixnums, caractères, ...) sont représentés directement 
4 0 0 100 0 18 20 0.0000 4 270 2265 1215 4860 dans le pointeur.
4 0 0 100 0 18 20 0.0000 4 270 9525 1215 5550 La sémantique par référence uniforme fait que les pointeurs explicites
4 0 0 100 0 18 20 0.0000 4 270 6120 1215 5895 ne sont pas nécéssaires ("pas de pointeurs")
4 0 0 100 0 18 20 0.0000 4 270 9825 1215 6585 Les declarations peuvent aider le compilateur à rempacer les références
4 0 0 100 0 18 20 0.0000 4 270 4110 1215 6930 par les objets correspondants
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Common Lisp est interactif}
4 0 0 50 0 18 20 0.0000 4 270 10065 1200 1800 Common Lisp est presque toujouts implémenté sous la forme de système
4 0 0 50 0 18 20 0.0000 4 270 10395 1200 2835 Une interaction calcule la valeur d'une expression, mais une expression peut
4 0 0 50 0 18 20 0.0000 4 210 4290 1200 3180 aussi avoir des effets de bord.  
4 0 0 50 0 18 20 0.0000 4 270 10125 1200 3870 En particulier un effet de bord peut être de modifier la valeur d'une variable
4 0 0 50 0 18 20 0.0000 4 210 3390 1200 4215 ou de créer une fonction.
4 0 0 50 0 18 20 0.0000 4 270 9660 1200 2145 interactif avec une boucle d'interaction (read-eval-print loop ou REPL).
4 0 0 50 0 18 20 0.0000 4 270 10860 1200 4905 Le langage n'a pas la notion de programme principal.  Il est néanmoins possible
4 0 0 50 0 18 20 0.0000 4 270 8775 1200 5250 de préciser la fonction à exécuter quand l'application est lancée.
4 0 0 50 0 18 20 0.0000 4 270 9705 1200 5940 Normalement, on exécute la commande Lisp une seule fois par séance.
4 0 0 50 0 18 20 0.0000 4 270 10875 1200 6285 En EMI, une séance est un TD ou une demie journée de travail.  Sur un ordinateur
4 0 0 50 0 18 20 0.0000 4 270 6030 1200 6630 personnel, une séance peut durer des mois. 
4 0 0 50 0 18 20 0.0000 4 285 10305 1200 7320 Le langage est conçu pour le développement interactif.  Les instances d'une
4 0 0 50 0 18 20 0.0000 4 270 10875 1200 7665 classes sont mises à jour quand la définition d'une classe change, par exemple.
4 0 0 50 0 18 20 0.0000 4 270 10200 1200 8010 Il faut écrire les applications pour faciliter l'interactivité aussi.  Souvent cela
4 0 0 50 0 18 20 0.0000 4 270 6705 1200 8355 nécessite la programmation sans effets de bord. 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Expressions}
4 0 0 50 0 18 20 0.0000 4 270 7650 1200 1500 Une expression (ou une forme) Common Lisp peut être :
4 0 0 50 0 18 20 0.0000 4 270 3135 1800 2100 un objet auto-évaluant,
4 0 0 50 0 18 20 0.0000 4 270 1920 1800 2700 un symbol, ou
4 0 0 50 0 18 20 0.0000 4 270 3705 1800 3300 une expression composée.
4 0 0 50 0 18 20 0.0000 4 270 9330 1200 4200 Une expression tapée à la boucle d'interaction est d'abord analysée 
4 0 0 50 0 18 20 0.0000 4 270 10260 1200 4545 syntaxiquement.  Le résultat de cette analyse est une représentation interne
4 0 0 50 0 18 20 0.0000 4 270 9870 1200 4890 de l'expression.  La fonction responsble de cette analyse s'appelle read.
4 0 0 50 0 18 20 0.0000 4 270 5805 1200 5235 Cette fonction est disponible à l'utilisateur.
4 0 0 50 0 18 20 0.0000 4 270 9885 1200 5925 La représentation interne de l'expression est ensuite évaluée, c'est à dire
4 0 0 50 0 18 20 0.0000 4 270 10290 1200 6270 que sa valeur est calculée.  Cette évaluation peut donner des effets de bord.
4 0 0 50 0 18 20 0.0000 4 270 9450 1200 6615 Le résultat de l'évaluation est un ou plusieurs objets Lisp.  La fonction
4 0 0 50 0 18 20 0.0000 4 270 7755 1200 6960 responsable de l'évaluation d'expression s'appelle eval.  
4 0 0 50 0 18 20 0.0000 4 270 5805 1200 7305 Cette fonction est disponible à l'utilisateur.
4 0 0 50 0 18 20 0.0000 4 270 10095 1200 7995 Les objets resultant de l'évaluation sont ensuite affichés (ou imprimés) en 
4 0 0 50 0 18 20 0.0000 4 270 10485 1200 8340 représentation externe. La fonction responsable de l'affichage s'appele print.
4 0 0 50 0 18 20 0.0000 4 270 5805 1200 8685 Cette fonction est disponible à l'utilisateur.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Lancer et quitter le système Lisp}
4 0 0 50 0 14 20 0.0000 4 240 2310 900 1800 napperon: lisp
4 0 0 50 0 14 20 0.0000 4 240 5940 900 2100 CMU Common Lisp release x86-linux...
4 0 0 50 0 14 20 0.0000 4 30 495 900 2400 ...
4 0 0 50 0 14 20 0.0000 4 180 1155 900 2700 * 1234 
4 0 0 50 0 14 20 0.0000 4 180 660 900 3300 1234
4 0 0 50 0 14 20 0.0000 4 180 1155 900 3600 * hello
4 0 0 50 0 14 20 0.0000 4 180 7425 900 4200 Error in ... : the variable HELLO is unbound.
4 0 0 50 0 14 20 0.0000 4 180 1485 900 4800 Restarts:
4 0 0 50 0 14 20 0.0000 4 240 5280 900 5100   0: [ABORT] Return to Top-Level
4 0 0 50 0 14 20 0.0000 4 240 3795 900 5700 Debug (type H for help)
4 0 0 50 0 14 20 0.0000 4 30 495 900 6000 ...
4 0 0 50 0 14 20 0.0000 4 225 660 900 6300 0] 0
4 0 0 50 0 14 20 0.0000 4 240 1320 900 6900 * (quit)
4 0 0 50 0 14 20 0.0000 4 195 1650 900 7200 napperon: 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Objets auto-évaluants}
4 0 0 50 0 18 20 0.0000 4 270 8235 1200 1800 Un objet auto-évaluant est la même chose qu'une constante.
4 0 0 50 0 18 20 0.0000 4 270 10635 1200 2490 Typiquement, il s'agit de nombres, de caractères ou de chaînes de caractères.
4 0 0 50 0 14 20 0.0000 4 180 990 1200 3300 * 1234
4 0 0 50 0 14 20 0.0000 4 180 660 1200 3900 1234
4 0 0 50 0 14 20 0.0000 4 240 825 1200 4200 * 6/8
4 0 0 50 0 14 20 0.0000 4 240 495 1200 4800 3/4
4 0 0 50 0 14 20 0.0000 4 240 825 1200 5100 * #\\c
4 0 0 50 0 14 20 0.0000 4 240 495 1200 5700 #\\c
4 0 0 50 0 14 20 0.0000 4 240 1815 1200 6000 * "bonjour"
4 0 0 50 0 14 20 0.0000 4 240 1485 1200 6600 "bonjour"
4 0 0 50 0 14 20 0.0000 4 240 1980 1200 6900 * #(1 2 3 4)
4 0 0 50 0 14 20 0.0000 4 240 1650 1200 7500 #(1 2 3 4)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7800 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Symboles}
4 0 0 50 0 18 20 0.0000 4 270 9510 1200 1800 Si l'expression est un symbole, il sera considéré comme le nom d'une
4 0 0 50 0 18 20 0.0000 4 270 7110 1200 2145 variable.  la fonction eval va donc renvoyer sa valeur.
4 0 0 50 0 14 20 0.0000 4 240 3135 1200 3000 * *standard-output*
4 0 0 50 0 14 20 0.0000 4 255 5940 1200 3600 #<Synonym Stream to SYSTEM:*STDOUT*>
4 0 0 50 0 14 20 0.0000 4 180 825 1200 3900 * nil
4 0 0 50 0 14 20 0.0000 4 165 495 1200 4500 NIL
4 0 0 50 0 14 20 0.0000 4 180 495 1200 4800 * t
4 0 0 50 0 14 20 0.0000 4 165 165 1200 5400 T
4 0 0 50 0 14 20 0.0000 4 180 1980 1200 5700 * *features*
4 0 0 50 0 14 20 0.0000 4 225 4785 1200 6300 (:MK-DEFSYSTEM :CL-MIT-R5 ...
4 0 0 50 0 14 20 0.0000 4 225 825 1200 6600  ...)
4 0 0 50 0 14 20 0.0000 4 180 495 1200 6900 * +
4 0 0 50 0 14 20 0.0000 4 180 1650 1200 7500 *FEATURES*
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7800 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Expressions composées}
6 1200 1275 11400 3000
4 0 0 50 0 18 20 0.0000 4 270 9855 1200 1500 Une expression composée est une liste de sous-expressions entourées
4 0 0 50 0 18 20 0.0000 4 270 9795 1200 1845 de parenthèses.   Souvent, la première sous-expression est un symbole
4 0 0 50 0 18 20 0.0000 4 270 10185 1200 2190 qui est le nom d'une fonction, d'une macro ou d'un opérateur spécial.   Les 
4 0 0 50 0 18 20 0.0000 4 270 9840 1200 2535 autres sous-expressions sont les arguments de la fonction, de la macro
4 0 0 100 0 18 20 0.0000 4 270 3450 1200 2880 ou de l'opérateur spécial.
-6
6 1200 3375 6375 8100
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 3600 * (+ 3 4)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 4200 7
4 0 0 50 0 14 20 0.0000 4 240 2970 1200 4500 * (length "hello")
4 0 0 50 0 14 20 0.0000 4 180 165 1200 5100 5
4 0 0 50 0 14 20 0.0000 4 240 5115 1200 5400 * (+ (* 3 4 2) (- 5 4) (/ 5 3))
4 0 0 50 0 14 20 0.0000 4 240 660 1200 6000 80/3
4 0 0 50 0 14 20 0.0000 4 225 4290 1200 6300 * (if (> 5 4) "oui" "non")
4 0 0 50 0 14 20 0.0000 4 180 825 1200 6900 "oui"
4 0 0 50 0 14 20 0.0000 4 240 3465 1200 7200 * (length *features*)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7800 37
4 0 0 50 0 14 20 0.0000 4 180 330 1200 8100 * 
-6
4 0 0 100 0 18 20 0.0000 4 270 10950 1200 8700 Ici, if est un opérateur spécial, alors que  +,  *,  -,  /,  >, length sont des fonctions. 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Expressions avec effets de bord}
4 0 0 100 0 18 20 0.0000 4 270 10350 1200 1800 Certains expressions peuvent avoir des effets de bord.  Il s'agit par exemple
4 0 0 100 0 18 20 0.0000 4 270 10605 1200 2145 de l'affectation d'une variable ou de l'affichage (autre que par la boucle REPL)
4 0 0 100 0 14 20 0.0000 4 225 1980 1200 3000 * (setf x 3)
4 0 0 100 0 14 20 0.0000 4 240 4785 1200 3300 Warning: Declaring X special.
4 0 0 100 0 14 20 0.0000 4 180 165 1200 3900 3
4 0 0 100 0 14 20 0.0000 4 180 495 1200 4200 * x
4 0 0 100 0 14 20 0.0000 4 180 165 1200 4800 3
4 0 0 100 0 14 20 0.0000 4 240 2805 1200 5100 * (+ (print 3) 4)
4 0 0 100 0 14 20 0.0000 4 180 165 1200 5700 3
4 0 0 100 0 14 20 0.0000 4 180 165 1200 6000 7
4 0 0 100 0 14 20 0.0000 4 180 330 1200 6300 * 
4 0 0 100 0 18 20 0.0000 4 270 9465 1200 6900 lci, setf est le nom d'une macro et (setf x 3) est une expression macro
4 0 0 100 0 18 20 0.0000 4 270 10530 1200 7245 (anglais: macro form); print est le nom d'une fonction avec un effet de bord et
4 0 0 100 0 18 20 0.0000 4 270 8340 1200 7590 (print 3) est une expression fonction (anglais: function form). 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition de fonction}
4 0 0 100 0 18 20 0.0000 4 270 9975 1200 8700 Cette indentation est obligatoire, car les programmeurs Lisp ne regardent
4 0 0 100 0 18 20 0.0000 4 270 7695 1200 9045 pas les parenthèses.  De plus, elle doit être automatique.
4 0 0 100 0 18 20 0.0000 4 270 9060 1200 1500 L'utilisateur peut définier des fonctions en utilisant la macro defun:
4 0 0 100 0 14 20 0.0000 4 225 3135 1200 2100 * (defun double (x)
4 0 0 100 0 14 20 0.0000 4 225 1980 1200 2400     (* 2 x))
4 0 0 100 0 14 20 0.0000 4 165 990 1200 3000 DOUBLE
4 0 0 100 0 14 20 0.0000 4 225 2145 1200 3300 * (double 10)
4 0 0 100 0 14 20 0.0000 4 180 330 1200 3900 20
4 0 0 100 0 14 20 0.0000 4 240 2310 1200 4200 * (double 3/2)
4 0 0 100 0 14 20 0.0000 4 180 165 1200 4800 3
4 0 0 100 0 14 20 0.0000 4 225 2310 1200 5100 * (double 1.5)
4 0 0 100 0 14 20 0.0000 4 180 495 1200 5700 3.0
4 0 0 100 0 14 20 0.0000 4 240 3465 1200 6000 * (defun my-gcd (x y)
4 0 0 100 0 14 20 0.0000 4 240 2475 1200 6300     (if (= x y)
4 0 0 100 0 14 20 0.0000 4 135 1485 1200 6600         x
4 0 0 100 0 14 20 0.0000 4 240 3135 1200 6900         (if (> x y)
4 0 0 100 0 14 20 0.0000 4 240 3960 1200 7200             (my-gcd y x)
4 0 0 100 0 14 20 0.0000 4 240 5445 1200 7500             (my-gcd x (- y x)))))
4 0 0 100 0 14 20 0.0000 4 165 990 1200 8100 MY-GCD
4 0 0 100 0 14 20 0.0000 4 180 330 1200 8400 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres}
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 2085 6465 2895 4125
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 2085 6465 2610 7770
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 3615 4095 4170 2595
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 3600 4095 4440 5610
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5385 2580 6210 1695
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5370 2565 6045 2925
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 7170 2880 8070 2310
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 7170 2865 8115 3225
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 9315 3165 10500 3165
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5220 5580 5760 4095
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5205 5565 5700 5070
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5220 5580 5730 6210
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 5190 5565 5775 7425
4 1 0 100 0 18 20 0.0000 4 210 1035 1470 6615 number
4 1 0 100 0 18 20 0.0000 4 270 1185 3285 7845 complex
4 1 0 100 0 18 20 0.0000 4 210 510 3285 4185 real
4 1 0 100 0 18 20 0.0000 4 210 615 4830 5700 float
4 1 0 100 0 18 20 0.0000 4 210 1020 4785 2685 rational
4 1 0 100 0 18 20 0.0000 4 270 1605 6600 5145 single-float
4 1 0 100 0 18 20 0.0000 4 210 1725 6660 6315 double-float
4 1 0 100 0 18 20 0.0000 4 210 1485 6615 4200 short-float
4 1 0 100 0 18 20 0.0000 4 270 1380 6615 7485 long-float
4 1 0 100 0 18 20 0.0000 4 210 615 6615 1800 ratio
4 1 0 100 0 18 20 0.0000 4 270 945 6600 3015 integer
4 1 0 100 0 18 20 0.0000 4 270 1020 8685 2400 bignum
4 1 0 100 0 18 20 0.0000 4 210 930 8685 3315 fixnum
4 1 0 100 0 18 20 0.0000 4 210 345 10815 3300 bit
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres: Entiers}
4 0 0 100 0 18 20 0.0000 4 270 4065 1200 2100 Précision arbitraire (bignums)
4 0 0 50 0 14 20 0.0000 4 225 2805 1200 2700 * (defun fact (n)
4 0 0 50 0 14 20 0.0000 4 225 2475 1200 3000     (if (= n 0)
4 0 0 50 0 14 20 0.0000 4 180 1485 1200 3300         1
4 0 0 50 0 14 20 0.0000 4 225 4785 1200 3600         (* n (fact (1- n)))))
4 0 0 50 0 14 20 0.0000 4 165 660 1200 4200 FACT
4 0 0 50 0 14 20 0.0000 4 225 1650 1200 4500 * (fact 5)
4 0 0 50 0 14 20 0.0000 4 180 495 1200 5100 120
4 0 0 50 0 14 20 0.0000 4 225 1815 1200 5700 * (fact 40)
4 0 0 50 0 14 20 0.0000 4 180 8085 1200 6300 8159152832478977734345611269596115894272000000000
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6900 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres: Entiers}
4 0 0 100 0 18 20 0.0000 4 270 9480 1200 1815 Opérations logiques sur les entiers:  vecteurs infinis de bits ayant soit
4 0 0 100 0 18 20 0.0000 4 255 6420 1200 2160 un nombre fini de "1", soit un nombre fini de "0".
4 0 0 100 0 14 20 0.0000 4 240 9405 1800 2925 logior, logxor, logand, logeqv, lognand, lognor, logandc1
4 0 0 100 0 14 20 0.0000 4 240 9735 1800 3225 logandc2, logorc1, logorc2, boole, lognot, logtest, logbitp
4 0 0 100 0 14 20 0.0000 4 240 2310 1800 3525 ash, logcount 
4 0 0 50 0 14 20 0.0000 4 240 2475 1200 4500 * (logior 14 3)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 5100 15
4 0 0 50 0 14 20 0.0000 4 225 5115 1200 5400 * (ash 200000000000000000000 2)
4 0 0 50 0 14 20 0.0000 4 180 3465 1200 6000 800000000000000000000
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6300 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres: Entiers}
4 0 0 100 0 18 20 0.0000 4 270 7755 1200 1800 Les fixnums sont possible à représenter dans le pointeur
4 0 0 100 0 18 20 0.0000 4 270 7725 1200 2490 La manipulation de "bytes" d'un nombre de bits arbitraire
4 0 0 100 0 18 20 0.0000 4 285 9030 1200 3180 Avec les declarations, possible de représenter de façon compacte
4 0 0 100 0 18 20 0.0000 4 270 4380 1200 3525 (par exemple dans les tableaux)
4 0 0 100 0 18 20 0.0000 4 270 4635 1200 4215 En particulier des tableaux de bits
4 0 0 50 0 14 20 0.0000 4 240 3630 1200 5100 * (fixnump (ash 1 28))
4 0 0 50 0 14 20 0.0000 4 240 3630 1200 6000 * (fixnump (ash 1 29))
4 0 0 50 0 14 20 0.0000 4 165 165 1200 5700 T
4 0 0 50 0 14 20 0.0000 4 165 495 1200 6600 NIL
4 0 0 50 0 14 20 0.0000 4 240 6600 1200 6900 * (make-array '(3 5) :element-type 'bit)
4 0 0 50 0 14 20 0.0000 4 240 6600 1200 7500 #2A((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres: ratio}
4 0 0 100 0 18 20 0.0000 4 270 8925 1200 1800 Permets de représenter le résultat d'une grande classe de calculs
4 0 0 100 0 18 20 0.0000 4 285 2175 1200 2145 de façon exacte
4 0 0 100 0 18 20 0.0000 4 270 1455 1200 2835 Exemples:
4 0 0 100 0 18 20 0.0000 4 270 7020 2100 3600 La programmation linéaire avec la méthode simplex
4 0 0 100 0 18 20 0.0000 4 330 2835 2100 4290 \311lasticité de widgets
4 0 0 100 0 18 20 0.0000 4 255 3225 1200 5100 Constantes:  1/3, 2/10, ...
4 0 0 50 0 14 20 0.0000 4 240 2145 1200 5700 * (+ 1/3 4/5)
4 0 0 50 0 14 20 0.0000 4 240 825 1200 6300 17/15
4 0 0 50 0 14 20 0.0000 4 240 2145 1200 6600 * (/ 4/3 2/3)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 7200 2
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Nombres: complexes}
4 0 0 100 0 18 20 0.0000 4 270 5670 1200 1800 Constantes:  #c(4 5), #c(1/2 3/4) #c(4/6 2.0)
4 0 0 100 0 18 20 0.0000 4 270 4950 1200 2490 Les opérations habituelles marchent
4 0 0 100 0 14 20 0.0000 4 240 9405 2100 3300 exp, expt, log, sqrt, isqrt, abs, phase, signum, sin, cos
4 0 0 100 0 14 20 0.0000 4 225 9735 2100 3600 tan, cis, asin, acos, atan, sinh, cosh, tanh, asinh, acosh,
4 0 0 100 0 14 20 0.0000 4 180 825 2100 3900 atanh
4 0 0 50 0 14 20 0.0000 4 255 2640 1200 6000 * (sin (/ pi 6))
4 0 0 50 0 14 20 0.0000 4 180 3465 1200 6600 0.49999999999999994d0
4 0 0 50 0 14 20 0.0000 4 240 2475 1200 7200 * (sin #c(3 4))
4 0 0 50 0 14 20 0.0000 4 240 3960 1200 7800 #C(3.8537378 -27.016813)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 8400 * 
4 0 0 100 0 18 20 0.0000 4 270 5880 1200 5100 Exemples d'utilité :  transformée de Fourier
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Booléens}
4 0 0 100 0 18 20 0.0000 4 255 2280 1200 2100 Constantes: nil, t
4 0 0 100 0 18 20 0.0000 4 270 840 1200 2790 nil = ()
4 0 0 100 0 18 20 0.0000 4 270 9510 1200 3480 n'importe quel objet sauf nil est considéré équivalent à t pour les tests
4 0 0 50 0 18 20 0.0000 4 270 3495 1200 4170 nil et t sont des symboles
4 0 0 50 0 18 20 0.0000 4 270 5850 1200 4860 la valeur de la variable nil est le symbole nil
4 0 0 50 0 18 20 0.0000 4 270 5400 1200 5550 la valeur de la variable t est le symbole t
4 0 0 50 0 14 20 0.0000 4 225 2310 1200 6300 * (if nil 2 3)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 6900 3
4 0 0 50 0 14 20 0.0000 4 225 1980 1200 7200 * (if 0 2 3)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 7800 2
4 0 0 50 0 14 20 0.0000 4 165 165 1200 8700 T
4 0 0 50 0 14 20 0.0000 4 180 330 1200 9000 * 
4 0 0 50 0 14 20 0.0000 4 225 2475 1200 8100 * (< 2 4 7 123)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Symboles}
4 0 0 100 0 18 20 0.0000 4 270 7005 1200 2100 Constantes:  abc, 234hello, |ceci n'est pas une pipe|
4 0 0 100 0 18 20 0.0000 4 270 6855 1200 2790 Sauf avec la syntaxe |...|, le nom est en majuscules
4 0 0 50 0 14 20 0.0000 4 225 2805 1200 3600 * (defvar abc 22)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 4200 ABC
4 0 0 50 0 14 20 0.0000 4 225 3300 1200 4500 * (defvar 234abc 11)
4 0 0 50 0 14 20 0.0000 4 180 990 1200 5100 234ABC
4 0 0 50 0 14 20 0.0000 4 240 6270 1200 5400 * (defvar |ceci n'est pas une pipe| 8)
4 0 0 50 0 14 20 0.0000 4 240 4125 1200 6000 |ceci n'est pas une pipe|
4 0 0 50 0 14 20 0.0000 4 240 5445 1200 6300 * (+ |ceci n'est pas une pipe| 3)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6900 11
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7200 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Quote}
4 0 0 50 0 18 20 0.0000 4 270 5880 1200 2145 (la valeur de nil est nil, et la valeur de t est t)
4 0 0 50 0 18 20 0.0000 4 270 9960 1200 1800 Comment est-ce que la valeur d'un symbole peut-être un autre symbole?
4 0 0 50 0 14 20 0.0000 4 180 495 1200 4500 *A*
4 0 0 50 0 14 20 0.0000 4 180 825 1200 4800 * *a*
4 0 0 50 0 14 20 0.0000 4 165 825 1200 5400 HELLO
4 0 0 50 0 14 20 0.0000 4 165 825 1200 6300 HELLO
4 0 0 50 0 14 20 0.0000 4 180 825 1200 6600 * *a*
4 0 0 50 0 14 20 0.0000 4 165 825 1200 7200 HELLO
4 0 0 50 0 14 20 0.0000 4 180 1155 1200 7500 * hello
4 0 0 50 0 14 20 0.0000 4 240 4125 1200 8100 |ceci n'est pas une pipe|
4 0 0 50 0 14 20 0.0000 4 180 330 1200 8400 * 
4 0 0 50 0 14 20 0.0000 4 240 4620 1200 3900 * (defvar *a* (quote hello))
4 0 0 50 0 14 20 0.0000 4 240 8250 1200 5700 * (defvar hello (quote |ceci n'est pas une pipe|))
4 0 0 50 0 18 20 0.0000 4 270 7275 1200 9000 Au lieu de taper (quote machin) on peut taper 'machin
4 0 0 50 0 18 20 0.0000 4 270 6720 1200 3000 La solution est un opérateur spécial appelé quote
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Symboles}
4 0 0 100 0 18 20 0.0000 4 270 8925 1200 3600 Tester l'égalité entre deux symboles est une opération très rapide
4 0 0 100 0 18 20 0.0000 4 270 7740 1200 1830 Tableau d'hachage dans le paquetage (package) courant
4 0 0 50 0 18 20 0.0000 4 270 10050 1200 2700 C'est la fonction read qui cherche le tableau d'hachage et crée le symbole
4 0 0 50 0 14 20 0.0000 4 240 6765 1200 4500 * (defvar *c* '|ceci n'est pas une pipe|)
4 0 0 50 0 14 20 0.0000 4 180 495 1200 5100 *C*
4 0 0 50 0 14 20 0.0000 4 240 6105 1200 5400 * (eq *c* '|ceci n'est pas une pipe})
4 0 0 50 0 14 20 0.0000 4 165 165 1200 6000 T
4 0 0 50 0 14 20 0.0000 4 240 2805 1200 6300 * (eq *c* 'hello)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 6900 NIL
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7200 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Symboles}
6 1200 1800 12600 6300
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 6000 2100 8100 2100 8100 5100 6000 5100 6000 2100
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 6000 2700 8100 2700
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 6000 3300 8100 3300
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 6000 3900 8100 3900
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 6000 4500 8100 4500
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 7050 2400 9300 2400
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 7050 3000 11400 3000
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 11400 2700 12300 2700 12300 6300 11400 6300 11400 2700
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6900 3600 9300 3600
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6900 4200 9300 4200
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6900 4800 9300 4800
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 9300 4800 9900 4800 9900 5100 9300 5100 9300 4800
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 10200 4800 10800 4800 10800 5100 10200 5100 10200 4800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 9750 4950 10200 4950
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 9450 4950 9450 5700
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 10350 4950 10350 5700
3 0 0 1 0 7 100 0 -1 0.000 0 1 0 6
	0 0 1.00 60.00 120.00
	 11850 4050 12600 3600 12600 2550 10800 1800 8250 1800 7650 1950
	 0.000 1.000 1.000 1.000 1.000 0.000
4 0 0 100 0 18 20 0.0000 4 270 2175 1200 2160 Représentation:
4 0 0 100 0 18 20 0.0000 4 150 750 4500 2550 name
4 0 0 100 0 18 20 0.0000 4 270 1170 4500 3150 package
4 0 0 100 0 18 20 0.0000 4 210 705 4500 3750 value
4 0 0 100 0 18 20 0.0000 4 210 1110 4500 4350 function
4 0 0 100 0 18 20 0.0000 4 270 585 4500 4950 plist
4 0 0 100 0 18 20 0.0000 4 210 1005 9450 2550 "ATAN"
4 0 0 100 0 18 20 0.0000 4 195 450 9450 3750 234
4 0 0 100 0 18 20 0.0000 4 210 1605 9450 4350 #<function>
4 0 0 100 0 18 20 0.0000 4 210 705 9000 6000 color
4 0 0 100 0 18 20 0.0000 4 210 450 10350 6000 red
-6
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Symboles: property list (plist)}
4 0 0 100 0 18 20 0.0000 4 270 3960 1200 2100 Une base de données simple
4 0 0 100 0 18 20 0.0000 4 270 1290 1200 3000 Exemple:
4 0 0 100 0 14 20 0.0000 4 240 5280 3900 3000 * (setf (get 'jean 'pere) 'paul)
4 0 0 100 0 14 20 0.0000 4 165 660 3900 3600 PAUL
4 0 0 100 0 14 20 0.0000 4 240 6930 3900 4200 * (setf (get 'paul 'profession) 'plombier)
4 0 0 100 0 14 20 0.0000 4 165 1320 3900 4800 PLOMBIER
4 0 0 100 0 14 20 0.0000 4 240 6105 3900 5400 * (get (get 'jean 'pere) 'profession)
4 0 0 100 0 14 20 0.0000 4 165 1320 3900 6000 PLOMBIER
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Caractères et chaînes de caractères}
4 0 0 0 0 18 20 0.0000 4 210 1500 1200 1800 Caractères
4 0 0 0 0 18 20 0.0000 4 270 5880 1800 2400 Constantes: #\\a, #\\b, #\\Space, #\\Newline,  ...
4 0 0 0 0 18 20 0.0000 4 210 1530 1800 3000 Fonctions: 
4 0 0 0 0 14 20 0.0000 4 240 6765 3900 3000 alpha-char-p, upper-case-p, lower-case-p,
4 0 0 0 0 14 20 0.0000 4 240 6765 3900 3300 both-case-p, digit-char-p, alphanumericp,
4 0 0 0 0 14 20 0.0000 4 240 7920 3900 3600 char=, char/=, char<, char>, char<=, char>=, ...
4 0 0 0 0 18 20 0.0000 4 210 3150 1200 4500 Chaînes de caractères:
4 0 0 0 0 18 20 0.0000 4 255 3870 1800 5100 Constantes: "abc", "ab\\"c", ...
4 0 0 0 0 18 20 0.0000 4 210 7575 1800 5625 Une chaîne de caractères est un vecteur est un tableaux
4 0 0 50 0 14 20 0.0000 4 225 3300 1200 6300 * (aref "abc def" 3)
4 0 0 50 0 14 20 0.0000 4 255 1155 1200 6900 #\\Space
4 0 0 50 0 14 20 0.0000 4 240 5775 1200 7200 * (lower-case-p (aref "abc def" 4))
4 0 0 50 0 14 20 0.0000 4 165 165 1200 7800 T
4 0 0 50 0 14 20 0.0000 4 240 5280 1200 8100 * (char< (aref "abc def" 1) #\\a)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 8700 NIL
4 0 0 50 0 14 20 0.0000 4 180 330 1200 9000 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes}
6 1200 1575 11850 9000
6 2100 3000 2700 3300
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 2100 3000 2700 3000 2700 3300 2100 3300 2100 3000
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 2400 3000 2400 3300
-6
6 2400 4500 3000 4800
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 2400 4500 3000 4500 3000 4800 2400 4800 2400 4500
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 2700 4500 2700 4800
-6
6 3600 4500 4200 4800
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 3600 4500 4200 4500 4200 4800 3600 4800 3600 4500
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 3900 4500 3900 4800
-6
6 4800 4500 5400 4800
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 4800 4500 5400 4500 5400 4800 4800 4800 4800 4500
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 5100 4500 5100 4800
-6
6 6000 4500 6600 4800
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 6000 4500 6600 4500 6600 4800 6000 4800 6000 4500
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 6300 4500 6300 4800
-6
6 2400 5700 3000 6000
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 2400 5700 3000 5700 3000 6000 2400 6000 2400 5700
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 2700 5700 2700 6000
-6
6 3600 5700 4200 6000
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 3600 5700 4200 5700 4200 6000 3600 6000 3600 5700
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 3900 5700 3900 6000
-6
6 4800 5700 5400 6000
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 4800 5700 5400 5700 5400 6000 4800 6000 4800 5700
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 5100 5700 5100 6000
-6
6 6000 5700 6600 6000
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 6000 5700 6600 5700 6600 6000 6000 6000 6000 5700
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 6300 5700 6300 6000
-6
6 2400 8025 3000 8325
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 2400 8025 3000 8025 3000 8325 2400 8325 2400 8025
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 2700 8025 2700 8325
-6
6 3600 8025 4200 8325
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 3600 8025 4200 8025 4200 8325 3600 8325 3600 8025
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 3900 8025 3900 8325
-6
6 2475 5175 6600 5475
4 0 0 0 0 18 20 0.0000 4 195 150 2475 5400 1
4 0 0 0 0 18 20 0.0000 4 210 315 3750 5400 nil
4 0 0 0 0 18 20 0.0000 4 210 720 4800 5400 "abc"
4 0 0 0 0 18 20 0.0000 4 210 480 6075 5400 xyz
-6
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 1500 3075 2100 3075
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2850 4650 3600 4650
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 4050 4650 4800 4650
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 5250 4650 6000 4650
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6450 4650 7200 4650
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2550 4650 2550 5100
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 3750 4650 3750 5100
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 4950 4650 4950 5100
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6150 4650 6150 5100
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 1800 4650 2400 4650
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2850 5850 3600 5850
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 4050 5850 4800 5850
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 5250 5850 6000 5850
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2550 5850 2550 6300
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 3750 5850 3750 6300
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 4950 5850 4950 6300
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 6150 5850 6150 6300
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 1800 5850 2400 5850
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 6300 6000 6600 5700
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 1800 8175 2400 8175
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2550 8175 2550 8625
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2850 8175 3600 8175
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 3750 8175 3750 8625
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 4050 8175 4800 8175
4 0 0 0 0 18 20 0.0000 4 270 3495 1200 1800 Une list est une séquence
4 0 0 0 0 18 20 0.0000 4 270 5235 1200 2490 Le type de base est la paire ou le cons
4 0 0 0 0 18 20 0.0000 4 210 315 7350 4800 nil
4 0 0 0 0 18 20 0.0000 4 270 9345 1200 3900 Une liste (anglais: proper list) est une suite de paires terminée par nil
4 0 0 0 0 18 20 0.0000 4 270 10350 1200 7425 Une liste étandue (anglais: dotted list) est terminée par un objet autre que nil
4 0 0 0 0 18 20 0.0000 4 210 870 4950 8325 "hello"
4 0 0 0 0 14 20 0.0000 4 240 2805 8700 4800 (1 nil "abc" xyz)
4 0 0 0 0 18 20 0.0000 4 195 150 2475 6675 1
4 0 0 0 0 18 20 0.0000 4 210 315 3750 6675 nil
4 0 0 0 0 18 20 0.0000 4 210 720 4800 6675 "abc"
4 0 0 0 0 18 20 0.0000 4 210 480 6075 6675 xyz
4 0 0 0 0 18 20 0.0000 4 195 150 2475 9000 1
4 0 0 0 0 18 20 0.0000 4 210 720 3450 9000 "abc"
4 0 0 0 0 14 20 0.0000 4 225 3135 8700 8400 (1 "abc" . "hello")
-6
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 50 0 18 20 0.0000 4 270 9795 1200 1800 Une liste tapée à la boucle REPL est considérée comme une expression
4 0 0 50 0 18 20 0.0000 4 270 9615 1200 2145 composée, et sera donc évaluée.  Pour obtenir une liste sans l'évaluer, 
4 0 0 50 0 18 20 0.0000 4 270 1845 1200 2490 utiliser quote.
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 3300 * (+ 3 4)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 3900 5
4 0 0 50 0 14 20 0.0000 4 225 1650 1200 4200 * '(+ 3 4)
4 0 0 50 0 14 20 0.0000 4 225 1155 1200 4800 (+ 3 4)
4 0 0 50 0 14 20 0.0000 4 240 4785 1200 5100 * (defvar *my-list* '(+ 3 4))
4 0 0 50 0 14 20 0.0000 4 240 1815 1200 6000 * *my-list*
4 0 0 50 0 14 20 0.0000 4 225 1155 1200 6600 (+ 3 4)
4 0 0 50 0 14 20 0.0000 4 180 1485 1200 5700 *MY-LIST*
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6900 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 0 0 18 20 0.0000 4 270 2925 1200 1800 Operations de base:  
4 0 0 0 0 14 20 0.0000 4 225 2310 4500 1800 cons, car, cdr
4 0 0 50 0 14 20 0.0000 4 225 5280 1200 2700 * (cons 1 (cons 2 (cons 3 nil)))
4 0 0 50 0 14 20 0.0000 4 225 1155 1200 3300 (1 2 3)
4 0 0 50 0 14 20 0.0000 4 240 4950 1200 3600 * (cons 'hello '(how are you))
4 0 0 50 0 14 20 0.0000 4 240 5445 1200 4500 * (setf *my-list* '(how are you))
4 0 0 50 0 14 20 0.0000 4 225 2145 1200 5100 (HOW ARE YOU)
4 0 0 50 0 14 20 0.0000 4 225 3135 1200 4200 (HELLO HOW ARE YOU)
4 0 0 50 0 14 20 0.0000 4 240 4125 1200 5400 * (cons 'hello *my-list*)
4 0 0 50 0 14 20 0.0000 4 225 3135 1200 6000 (HELLO HOW ARE YOU)
4 0 0 50 0 14 20 0.0000 4 240 1815 1200 6300 * *my-list*
4 0 0 50 0 14 20 0.0000 4 225 2145 1200 6900 (HOW ARE YOU)
4 0 0 50 0 14 20 0.0000 4 240 2805 1200 7200 * (car *my-list*)
4 0 0 50 0 14 20 0.0000 4 240 2805 1200 8100 * (cdr *my-list*)
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 8700 (ARE YOU)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 7800 HOW
4 0 0 50 0 14 20 0.0000 4 180 330 1200 9000 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 50 0 18 20 0.0000 4 270 4005 1200 1800 Opérations plus complexes : 
4 0 0 50 0 14 20 0.0000 4 240 4290 5700 1800 list, append, reverse, ...
4 0 0 50 0 14 20 0.0000 4 225 3135 1200 2700 * (setf *a* 'hello)
4 0 0 50 0 14 20 0.0000 4 165 825 1200 3300 HELLO
4 0 0 50 0 14 20 0.0000 4 240 7425 1200 3600 * (setf *my-list* '(*a* 3 *standard-output*))
4 0 0 50 0 14 20 0.0000 4 225 4125 1200 4200 (*A* 3 *STANDARD-OUTPUT*)
4 0 0 50 0 14 20 0.0000 4 240 8085 1200 4500 * (setf *my-list* (list *a* 3 *standard-output*))
4 0 0 50 0 14 20 0.0000 4 255 7425 1200 5100 (HELLO 3 #<Synonym Stram to SYSTEM:*STDOUT*>)
4 0 0 50 0 14 20 0.0000 4 240 4785 1200 5400 * (append *my-list* '(a b c))
4 0 0 50 0 14 20 0.0000 4 255 8415 1200 6000 (HELLO 3 #<Synonym Stram to SYSTEM:*STDOUT*> A B C)
4 0 0 50 0 14 20 0.0000 4 240 1815 1200 6300 * *my-list*
4 0 0 50 0 14 20 0.0000 4 255 7425 1200 6900 (HELLO 3 #<Synonym Stram to SYSTEM:*STDOUT*>)
4 0 0 50 0 14 20 0.0000 4 255 7425 1200 8700 (HELLO 3 #<Synonym Stram to SYSTEM:*STDOUT*>)
4 0 0 50 0 14 20 0.0000 4 240 3465 1200 7200 * (reverse *my-list*)
4 0 0 50 0 14 20 0.0000 4 255 7425 1200 7800 (#<Synonym Stram to SYSTEM:*STDOUT*> 3 HELLO)
4 0 0 50 0 14 20 0.0000 4 240 1815 1200 8100 * *my-list*
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 0 0 18 20 0.0000 4 210 1035 1200 2490 Utiliser 
4 0 0 0 0 14 20 0.0000 4 240 660 2400 2475 endp
4 0 0 0 0 18 20 0.0000 4 270 3510 3300 2475 pour terminer la récursion
4 0 0 0 0 18 20 0.0000 4 210 6000 1200 1800 Structure de contr\364le de base:  la récursivite
4 0 0 50 0 14 20 0.0000 4 240 4455 1200 3300 * (defun greater-than (l x)
4 0 0 50 0 14 20 0.0000 4 240 2640 1200 3600     (if (endp l)
4 0 0 50 0 14 20 0.0000 4 225 1815 1200 3900         '()
4 0 0 50 0 14 20 0.0000 4 225 4125 1200 4200         (if (> (car l) x)
4 0 0 50 0 14 20 0.0000 4 240 8415 1200 4500             (cons (car l) (greater-than (cdr l) x))
4 0 0 50 0 14 20 0.0000 4 240 6435 1200 4800             (greater-than (cdr l) x))))
4 0 0 50 0 14 20 0.0000 4 165 1980 1200 5400 GREATER-THAN
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 6300 (5 6 5 7)
4 0 0 50 0 14 20 0.0000 4 240 5775 1200 5700 * (greater-than '(5 3 6 4 5 3 7) 4)
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 7200 (5 6 5 7)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7500 * 
4 0 0 50 0 14 20 0.0000 4 225 9075 1200 6600 * (remove-if-not (lambda (x) (> x 4)) '(5 3 6 4 5 3 7))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 0 0 18 20 0.0000 4 210 1470 1200 1800 Attention:  
4 0 0 0 0 14 20 0.0000 4 225 1815 1200 2700 * (car nil)
4 0 0 0 0 14 20 0.0000 4 165 495 1200 3300 NIL
4 0 0 0 0 14 20 0.0000 4 225 1815 1200 3600 * (cdr nil)
4 0 0 0 0 14 20 0.0000 4 165 495 1200 4200 NIL
4 0 0 50 0 14 20 0.0000 4 180 330 1200 4500 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
4 0 0 0 0 18 20 0.0000 4 210 2205 1200 1800 Atomes et listes
4 0 0 0 0 14 20 0.0000 4 240 2970 1800 3600 (defun my-atom (x)
4 0 0 0 0 14 20 0.0000 4 240 3135 1800 2700 (defun my-listp (x)
4 0 0 0 0 14 20 0.0000 4 240 4290 1800 3000   (or (null x) (consp x)))
4 0 0 0 0 14 20 0.0000 4 240 2970 1800 3900   (not (consp x)))
4 0 0 0 0 18 20 0.0000 4 330 945 1200 5400 \311galité
4 0 0 0 0 14 20 0.0000 4 225 3300 1800 6300 * (setf x (list 'a))
4 0 0 0 0 14 20 0.0000 4 225 495 1800 6600 (A)
4 0 0 0 0 14 20 0.0000 4 240 1650 1800 6900 * (eq x x)
4 0 0 0 0 14 20 0.0000 4 165 165 1800 7200 T
4 0 0 0 0 14 20 0.0000 4 240 1815 1800 7500 * (eql x x)
4 0 0 0 0 14 20 0.0000 4 165 165 1800 7800 T
4 0 0 0 0 14 20 0.0000 4 240 2145 1800 8100 * (equal x x)
4 0 0 0 0 14 20 0.0000 4 165 165 1800 8400 T
4 0 0 0 0 14 20 0.0000 4 240 2970 1800 8700 * (eq x (list 'a))
4 0 0 0 0 14 20 0.0000 4 165 495 1800 9000 NIL
4 0 0 0 0 14 20 0.0000 4 240 3135 7500 6300 * (eql x (list 'a))
4 0 0 0 0 14 20 0.0000 4 165 495 7500 6600 NIL
4 0 0 0 0 14 20 0.0000 4 240 3465 7500 6900 * (equal x (list 'a))
4 0 0 0 0 14 20 0.0000 4 165 165 7500 7200 T
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Listes (suite)}
6 1200 3675 12225 8475
6 1200 3675 12225 5175
4 0 0 0 0 14 20 0.0000 4 180 1155 1200 3900 Autres:
4 0 0 0 0 14 20 0.0000 4 240 7920 3600 3900 length, subseq, copy-seq, fill, replace, count, 
4 0 0 0 0 14 20 0.0000 4 240 7755 3600 4200 reverse, nreverse, concatenate, position, find,
4 0 0 0 0 14 20 0.0000 4 240 7920 3600 4500 sort, merge, map, some, every, notany, notevery,
4 0 0 0 0 14 20 0.0000 4 240 8085 3600 4800 reduce, search, remove, remove-dupicates, delete,
4 0 0 0 0 14 20 0.0000 4 240 8580 3600 5100 delete-duplicates, substitute, nsubstitute, mismatch
-6
4 0 0 0 0 14 20 0.0000 4 240 7920 3600 6000 list*, append, copy-list, copy-alist, copy-tree,
4 0 0 0 0 14 20 0.0000 4 240 7590 3600 6300 revappend, nconc, nreconc, push, pushnew, pop,
4 0 0 0 0 14 20 0.0000 4 240 6765 3600 6600 butlast, nbutlast, ldiff, rplaca, rplacd,
4 0 0 0 0 14 20 0.0000 4 225 8085 3600 6900 subst, subst-if, subst-if-not, nsubst, nsubst-if,
4 0 0 0 0 14 20 0.0000 4 240 8415 3600 7200 nsubst-if-not, sublis, member, tailp, adjoin,union,
4 0 0 0 0 14 20 0.0000 4 225 7755 3600 7500 intersection, set-difference, nset-difference, 
4 0 0 0 0 14 20 0.0000 4 240 7425 3600 7800 set-exclusive-or, nset-exclusive-or, subsetp,
4 0 0 0 0 14 20 0.0000 4 240 7590 3600 8100 acons, pairlis, assoc, assoc-if, assoc-if-not,
4 0 0 0 0 14 20 0.0000 4 225 6270 3600 8400 find, rassoc, rassoc-if, rassoc-if-not
-6
4 0 0 0 0 18 20 0.0000 4 210 1845 1200 2100 Construction:
4 0 0 0 0 18 20 0.0000 4 210 960 1200 2700 Accès:
4 0 0 0 0 14 20 0.0000 4 225 1650 3600 2100 cons, list
4 0 0 0 0 14 20 0.0000 4 225 8910 3600 2700 car, cdr, nth, nthcdr, last, elt, cadadr, cdaaar, ... 
4 0 0 0 0 14 20 0.0000 4 225 4125 3600 3000 first, second, ..., tenth
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Tableaux}
4 0 0 50 0 14 20 0.0000 4 240 3465 1200 1500 * (make-array '(4 3))
4 0 0 50 0 14 20 0.0000 4 240 5940 1200 2100 #2A((0 0 0) (0 0 0) (0 0 0) (0 0 0))
4 0 0 50 0 14 20 0.0000 4 240 6600 1200 2400 * (make-array '(4 3) :initial-element 5)
4 0 0 50 0 14 20 0.0000 4 240 5940 1200 3000 #2A((5 5 5) (5 5 5) (5 5 5) (5 5 5))
4 0 0 50 0 14 20 0.0000 4 225 2640 1200 4200 (7 "hello" HI T)
4 0 0 50 0 14 20 0.0000 4 240 10395 1200 3600 * (make-array 4 :initial-contents (list (+ 3 4) "hello" 'hi t))
4 0 0 50 0 14 20 0.0000 4 240 7095 1200 4500 * (setf *x* (make-array 6 :fill-pointer 4))
4 0 0 50 0 14 20 0.0000 4 240 1650 1200 5100 #(0 0 0 0)
4 0 0 50 0 14 20 0.0000 4 240 2310 1200 5400 * (length *x*)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 6000 4
4 0 0 50 0 14 20 0.0000 4 240 4785 1200 6300 * (setf (fill-pointer *x* 6))
4 0 0 50 0 14 20 0.0000 4 180 165 1200 6900 6
4 0 0 50 0 14 20 0.0000 4 240 2310 1200 7200 * (length *x*)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 7800 6
4 0 0 50 0 14 20 0.0000 4 240 6105 1200 8100 * (adjust-array *x* :fill-pointer 20)
4 0 0 50 0 14 20 0.0000 4 240 6930 1200 8700 #(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 9000 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Structures}
4 0 0 50 0 14 20 0.0000 4 15 660 1200 1800     
4 0 0 50 0 14 20 0.0000 4 240 7590 1200 1500 * (defstruct person name address phone-number)
4 0 0 50 0 14 20 0.0000 4 165 990 1200 2100 PERSON
4 0 0 50 0 14 20 0.0000 4 240 2475 1200 2400 * (make-person)
4 0 0 50 0 14 20 0.0000 4 240 5775 1200 3300 * (make-person :name "Bobby Beach")
4 0 0 50 0 14 20 0.0000 4 255 10065 1200 3900 #S(PERSON :NAME "Bobby Beach" :ADDRESS NIL :PHONE-NUMBER NIL)
4 0 0 50 0 14 20 0.0000 4 240 8415 1200 3000 #S(PERSON :NAME NIL :ADDRESS NIL :PHONE-NUMBER NIL)
4 0 0 50 0 14 20 0.0000 4 240 10230 1200 4200 * (defstruct person (name "unknown") address (phone-number 0))
4 0 0 50 0 14 20 0.0000 4 165 990 1200 4800 PERSON
4 0 0 50 0 14 20 0.0000 4 240 5775 1200 5100 * (make-person :name "Bobby Beach")
4 0 0 50 0 14 20 0.0000 4 255 9735 1200 5700 #S(PERSON :NAME "Bobby Beach" :ADDRESS NIL :PHONE-NUMBER 0)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6000 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Tables d'hachage}
4 0 0 50 0 14 20 0.0000 4 225 4950 1200 1500 * (setf *x* (make-hash-table))
4 0 0 50 0 14 20 0.0000 4 240 6435 1200 2100 #<EQL hash table, 0 entries (480558ED)>
4 0 0 50 0 14 20 0.0000 4 240 3795 1200 2400 * (gethash 'weight *x*)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 3000 NIL
4 0 0 50 0 14 20 0.0000 4 165 495 1200 3300 NIL
4 0 0 50 0 14 20 0.0000 4 240 5610 1200 3600 * (setf (gethash 'weight *x*) 234)
4 0 0 50 0 14 20 0.0000 4 180 495 1200 4200 234
4 0 0 50 0 14 20 0.0000 4 240 3795 1200 4500 * (gethash 'weight *x*)
4 0 0 50 0 14 20 0.0000 4 180 495 1200 5100 234
4 0 0 50 0 14 20 0.0000 4 165 165 1200 5400 T
4 0 0 50 0 14 20 0.0000 4 240 4785 1200 5700 * (setf (gethash 11 *x*) nil)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 6300 NIL
4 0 0 50 0 14 20 0.0000 4 240 2970 1200 6600 * (gethash 11 *x*)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 7200 NIL
4 0 0 50 0 14 20 0.0000 4 165 165 1200 7500 T
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7800 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Fonctions de première classe}
4 0 0 50 0 18 20 0.0000 4 270 6225 1200 1800 Un objet est de première classe s'il peut être :
4 0 0 50 0 18 20 0.0000 4 255 3165 1800 2400 la valeur d'une variable,
4 0 0 50 0 18 20 0.0000 4 270 4950 1800 2745 l'argument à un appel de fonction, et
4 0 0 50 0 18 20 0.0000 4 270 3450 1800 3090 renvoyé par une fonction.
4 0 0 50 0 14 20 0.0000 4 210 990 1200 4200 * #'1+
4 0 0 50 0 14 20 0.0000 4 240 4125 1200 4800 #<Function 1+ {103744B9}>
4 0 0 50 0 14 20 0.0000 4 255 4290 1200 5100 * (mapcar #'1+ '(4 3 5 8))
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 5700 (5 4 6 9)
4 0 0 50 0 14 20 0.0000 4 240 4455 1200 6000 * (reduce #'max '(4 3 5 8))
4 0 0 50 0 14 20 0.0000 4 180 165 1200 6600 8
4 0 0 50 0 14 20 0.0000 4 255 5280 1200 6900 * (funcall (complement #'<) 3 5)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 7800 * 
4 0 0 50 0 14 20 0.0000 4 165 165 1200 7500 T
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Fonctions anonymes}
4 0 0 50 0 14 20 0.0000 4 240 6930 1200 1800 * (mapcar (lambda (x) (+ x 2)) '(3 4 5 6))
4 0 0 50 0 14 20 0.0000 4 225 1485 1200 2400 (5 6 7 8)
4 0 0 50 0 14 20 0.0000 4 225 9735 1200 2700 * (find-if (lambda (x) (> x 5)) '(5 8 3 9 4 2) :from-end t)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 3300 9
4 0 0 50 0 14 20 0.0000 4 240 6930 1200 3600 * (setf *l* (list "how" "hi" "are" "you"))
4 0 0 50 0 14 20 0.0000 4 240 3960 1200 4200 ("how" "hi" "are" "you")
4 0 0 50 0 14 20 0.0000 4 240 8745 1200 4500 * (sort *l* (lambda (x y) (< (length x) (length y))))
4 0 0 50 0 14 20 0.0000 4 240 3960 1200 5100 ("hi" "how" "are" "you")
4 0 0 50 0 14 20 0.0000 4 180 825 1200 5400 * *l*
4 0 0 50 0 14 20 0.0000 4 240 3135 1200 6000 ("how" "are" "you")
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6300 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Structures de contr\364le}
4 0 0 0 0 18 20 0.0000 4 210 795 1200 2100 Blocs
4 0 0 0 0 18 20 0.0000 4 210 1395 1200 2790 Contextes
4 0 0 0 0 18 20 0.0000 4 210 1890 1200 3480 Conditionnels
4 0 0 0 0 18 20 0.0000 4 210 1110 1200 4170 Itération
4 0 0 0 0 18 20 0.0000 4 270 2355 1200 4860 Valeurs multiples
4 0 0 0 0 18 20 0.0000 4 210 2355 1200 5550 Sauts non locaux
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Blocs}
4 0 0 0 0 18 20 0.0000 4 270 5790 1200 2100 Trois types de bloc: progn, block, tagbody
4 0 0 0 0 18 20 0.0000 4 270 9510 1200 3135 La valeur de la dernière expression est la valeur de l'expression progn
4 0 0 0 0 14 20 0.0000 4 240 990 1200 3900 (progn
4 0 0 0 0 14 20 0.0000 4 240 2970 1200 4200   (setf a (+ x y))
4 0 0 0 0 14 20 0.0000 4 240 1815 1200 4500   (myfun a)
4 0 0 0 0 14 20 0.0000 4 225 1650 1200 4800   (* a 5))
4 0 0 0 0 18 20 0.0000 4 270 5445 1200 5700 Block est comme un progn avec un nom
4 0 0 0 0 14 20 0.0000 4 225 1980 1200 6600 (block found
4 0 0 0 0 14 20 0.0000 4 225 2970 1200 6900   (do-stuff ...)  
4 0 0 0 0 14 20 0.0000 4 225 6930 1200 7200   (when (detected) (return-from found 23))
4 0 0 0 0 14 20 0.0000 4 225 3465 1200 7500   (do-some-more ...))
4 0 0 0 0 18 20 0.0000 4 270 9525 1200 8400 Tagbody est la construction de base pour les blocs, mais n'est jamais
4 0 0 0 0 18 20 0.0000 4 270 4845 1200 8745 utilisé directement par un utilisateur
4 0 0 0 0 18 20 0.0000 4 270 7245 1200 2790 Progn permet d'évaluer des expression en séquence.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Contexte}
4 0 0 0 0 18 20 0.0000 4 210 3660 1200 1800 Un bloc + variables locales
4 0 0 50 0 14 20 0.0000 4 240 5445 1200 2700 * (let ((len (length *features*))
4 0 0 50 0 14 20 0.0000 4 255 5115 1200 3000         (fun (complement #'<)))
4 0 0 50 0 14 20 0.0000 4 225 4125 1200 3300     (funcall fun len 10))
4 0 0 50 0 14 20 0.0000 4 165 165 1200 3900 T
4 0 0 50 0 14 20 0.0000 4 225 4455 1200 4500          (min (min len 5)))
4 0 0 50 0 14 20 0.0000 4 240 4620 1200 4800     (make-array (list min)))
4 0 0 50 0 14 20 0.0000 4 240 5610 1200 4200 * (let* ((len (length *features*))
4 0 0 50 0 14 20 0.0000 4 240 1980 1200 5400 #(0 0 0 0 0)
4 0 0 50 0 14 20 0.0000 4 180 330 1200 5700 * 
4 0 0 50 0 18 20 0.0000 4 270 5565 1200 6300 la dernière expression est équivalente à :
4 0 0 50 0 14 20 0.0000 4 240 5115 2100 6900 (let ((len (length *features*))
4 0 0 50 0 14 20 0.0000 4 225 4290 2100 7200   (let ((min (min len 5)))
4 0 0 50 0 14 20 0.0000 4 240 4785 2100 7500     (make-array (list min))))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Conditionnels}
6 1200 1575 7800 8775
4 0 0 0 0 14 20 0.0000 4 225 1815 1200 1800 (if (f ...)
4 0 0 0 0 14 20 0.0000 4 240 1815 1200 2100     (g ...)
4 0 0 0 0 14 20 0.0000 4 225 1980 1200 2400     "hello")
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 3000 (when (f ...)
4 0 0 0 0 14 20 0.0000 4 225 2475 1200 4500 (unless (f ...)
4 0 0 0 0 14 20 0.0000 4 240 1485 1200 4800   (g ...)
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 5100   (setf x 23)
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 5400   (+ x y))
4 0 0 0 0 14 20 0.0000 4 240 1485 1200 3300   (g ...)
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 3600   (setf x 23)
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 3900   (+ x y))
4 0 0 0 0 14 20 0.0000 4 240 6600 1200 6000 (cond ((> x 3) (setf y (g ...)) (+ x y))
4 0 0 0 0 14 20 0.0000 4 225 4125 1200 6300       (finished (+ x 15))
4 0 0 0 0 14 20 0.0000 4 225 1980 1200 6600       (t 0))
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 7200 (case (f ...)
4 0 0 0 0 14 20 0.0000 4 240 4125 1200 7500   ((apr jun sept nov) 30)
4 0 0 0 0 14 20 0.0000 4 240 4950 1200 7800   (feb (if (leap-year) 29 28))
4 0 0 0 0 14 20 0.0000 4 225 1485 1200 8100   (t 31))
4 0 0 0 0 14 20 0.0000 4 240 2310 1200 8700 (typecase ...)
-6
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Itération}
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 1800 (do ((i 0 (1+ i))
4 0 0 0 0 14 20 0.0000 4 240 2970 1200 2100      (j n (1- i)))
4 0 0 0 0 14 20 0.0000 4 240 3795 1200 2400     ((<= j 0) (+ x y)))
4 0 0 0 0 14 20 0.0000 4 240 4290 1200 2700   (format t "~a ~a~%" i j)
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 3000   (f i j))
4 0 0 0 0 14 20 0.0000 4 225 1485 1200 3600 (do* ...)
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 4200 (dolist (elem (mapcar ...) 'done)
4 0 0 0 0 14 20 0.0000 4 225 4125 1200 4500   (format t "~a~%" elem))
4 0 0 0 0 14 20 0.0000 4 240 3795 1200 5100 (dotimes (i 10 (+ x y))
4 0 0 0 0 14 20 0.0000 4 225 3630 1200 5400   (format t "~a~%" i))
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 6000 (mapc ...)
4 0 0 0 0 14 20 0.0000 4 240 6765 1200 6600 (loop for i from 1 to (compute-top-value)
4 0 0 0 0 14 20 0.0000 4 240 5610 1200 6900       while (not (unacceptable i))
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 7200       collect (square i)
4 0 0 0 0 14 20 0.0000 4 240 6765 1200 7500       do (format t "Working on ~D now" i)
4 0 0 0 0 14 20 0.0000 4 240 3300 1200 7800       when (evenp i)
4 0 0 0 0 14 20 0.0000 4 225 7920 1200 8100         do (format t "~D is a non-odd number" i)
4 0 0 0 0 14 20 0.0000 4 240 6930 1200 8400       finally (format t "About to exit!"))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Valeurs multiples}
4 0 0 0 0 14 20 0.0000 4 240 6435 1200 1800 (multiple-value-bind (x y) (floor 75 4)
4 0 0 0 0 14 20 0.0000 4 240 2145 1200 2100   (list x y))
4 0 0 0 0 14 20 0.0000 4 225 1485 1200 2700 => (18 3)
4 0 0 0 0 14 20 0.0000 4 225 5115 1200 3300 (values (f ...) 'hello (+ 3 4))
4 0 0 0 0 14 20 0.0000 4 255 6270 1200 3900 (multiple-value-call #'+ (floor 75 4))
4 0 0 0 0 14 20 0.0000 4 240 5610 1200 4500 (multiple-value-list (floor 75 4))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Macros}
4 0 0 0 0 14 20 0.0000 4 225 3795 1200 2100   (list 'setf var nil))
4 0 0 0 0 14 20 0.0000 4 225 3300 1200 1800 (defmacro nil! (var)
4 0 0 0 0 18 20 0.0000 4 270 8460 1200 2925 Evaluation en deux phases:  macro-expansion puis évaluation
4 0 0 0 0 18 20 0.0000 4 270 8025 1200 3615 Important:  la macro-expansion est faite par le compilateur
4 0 0 0 0 14 20 0.0000 4 225 1320 1200 4500 (nil! x)
4 0 0 0 0 18 20 0.0000 4 210 975 1200 5100 devient
4 0 0 0 0 14 20 0.0000 4 225 1980 1200 5700 (setf x nil)
4 0 0 0 0 18 20 0.0000 4 270 6780 1200 6300 qui sera compilé à la place de l'expression initiale
4 0 0 0 0 18 20 0.0000 4 270 8340 1200 6900 Les macros permettent donc de programmer le compilateur.  
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Backquote}
4 0 0 0 0 14 20 0.0000 4 225 2640 1200 1500 * (setf a 1 b 2)
4 0 0 50 0 14 20 0.0000 4 180 165 1200 2100 2
4 0 0 0 0 14 20 0.0000 4 225 3960 1200 2400 * `(a is ,a and b is ,b)
4 0 0 0 0 14 20 0.0000 4 225 3135 1200 3000 (A IS 1 AND B IS 2)
4 0 0 0 0 14 20 0.0000 4 225 3630 1200 3300 * (defmacro nil! (var)
4 0 0 0 0 14 20 0.0000 4 225 3465 1200 3600     `(setf ,var nil))
4 0 0 50 0 14 20 0.0000 4 180 660 1200 4200 NIL!
4 0 0 50 0 14 20 0.0000 4 225 1980 1200 4500 * (nil! *x*)
4 0 0 50 0 14 20 0.0000 4 165 495 1200 5100 NIL
4 0 0 50 0 14 20 0.0000 4 225 1155 1200 6000 (1 2 3)
4 0 0 0 0 14 20 0.0000 4 225 4785 1200 6300 * `(the list is ,lst I think)
4 0 0 0 0 14 20 0.0000 4 225 4785 1200 6900 (THE LIST IS (1 2 3) I THINK)
4 0 0 0 0 14 20 0.0000 4 225 5775 1200 7200 * `(the elements are ,@lst I think)
4 0 0 0 0 14 20 0.0000 4 225 5280 1200 7800 (THE ELEMENTS ARE 1 2 3 I THINK)
4 0 0 0 0 14 20 0.0000 4 225 3465 1200 5400 * (setf lst '(1 2 3))
4 0 0 50 0 14 20 0.0000 4 180 330 1200 8100 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemples}
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 2100 (defmacro while (test &rest body)
4 0 0 0 0 14 20 0.0000 4 225 1485 1200 2400   `(do ()
4 0 0 0 0 14 20 0.0000 4 225 3300 1200 2700        ((not ,test))
4 0 0 0 0 14 20 0.0000 4 240 2145 1200 3000      ,@body))
4 0 0 0 0 14 20 0.0000 4 240 7095 1200 4800 (defmacro for (init test update &rest body)
4 0 0 0 0 14 20 0.0000 4 240 1485 1200 5100   `(progn
4 0 0 0 0 14 20 0.0000 4 225 1650 1200 5400      ,init
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 5700      (while ,test
4 0 0 0 0 14 20 0.0000 4 240 2145 1200 6000        ,@body
4 0 0 0 0 14 20 0.0000 4 240 2805 1200 6300        ,update)))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Difficultés}
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 7050 2550 8925 2550 8925 3225 7050 3225 7050 2550
4 0 0 0 0 18 20 0.0000 4 270 2805 1200 1800 Capture de variables
4 0 0 0 0 14 20 0.0000 4 240 5115 1200 2400 (defmacro ntimes (n &rest body)
4 0 0 0 0 14 20 0.0000 4 225 3465 1200 2700   `(do ((x 0 (1+ x)))
4 0 0 0 0 14 20 0.0000 4 225 2970 1200 3000        ((>= x ,n))
4 0 0 0 0 14 20 0.0000 4 240 2145 1200 3300      ,@body))
4 0 0 0 0 18 24 0.0000 4 285 1575 7200 3000 incorrect
4 0 0 0 0 14 20 0.0000 4 225 2475 1200 4500 * (let ((x 10))
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 4800     (ntimes 5
4 0 0 0 0 14 20 0.0000 4 225 3630 1200 5100       (setf x (1+ x)))
4 0 0 0 0 14 20 0.0000 4 225 990 1200 5400     x)
4 0 0 0 0 14 20 0.0000 4 180 330 1200 6000 10
4 0 0 50 0 14 20 0.0000 4 180 330 1200 6300 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Difficultés}
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 7050 2550 8925 2550 8925 3225 7050 3225 7050 2550
4 0 0 0 0 18 24 0.0000 4 285 1575 7200 3000 incorrect
4 0 0 0 0 18 20 0.0000 4 270 2520 1200 1800 Multiple évaluation
4 0 0 0 0 14 20 0.0000 4 240 5115 1200 2400 (defmacro ntimes (n &rest body)
4 0 0 0 0 14 20 0.0000 4 240 3465 1200 2700   (let ((g (gensym)))
4 0 0 0 0 14 20 0.0000 4 240 4125 1200 3000     `(do ((,g 0 (1+ ,g)))
4 0 0 0 0 14 20 0.0000 4 240 3465 1200 3300          ((>= ,g ,n))
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 3600        ,@body)))
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 4800 (let ((v 10))
4 0 0 0 0 14 20 0.0000 4 225 4125 1200 5100   (ntimes (setf v (1- v))
4 0 0 0 0 14 20 0.0000 4 120 825 1200 6000 *****
4 0 0 0 0 14 20 0.0000 4 225 3300 1200 5400     (format t "*")))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Difficultés}
2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5
	 7050 2550 8550 2550 8550 3225 7050 3225 7050 2550
4 0 0 0 0 14 20 0.0000 4 240 5115 1200 2400 (defmacro ntimes (n &rest body)
4 0 0 0 0 18 24 0.0000 4 270 1245 7200 3000 correct
4 0 0 0 0 14 20 0.0000 4 240 3300 1200 2700   (let ((g (gensym))
4 0 0 0 0 14 20 0.0000 4 240 3465 1200 3000         (h (gensym)))
4 0 0 0 0 14 20 0.0000 4 225 3135 1200 3300     `(let ((,h ,n))
4 0 0 0 0 14 20 0.0000 4 240 4455 1200 3600        (do ((,g 0 (1+ ,g)))
4 0 0 0 0 14 20 0.0000 4 240 3795 1200 3900            ((>= ,g ,h))
4 0 0 0 0 14 20 0.0000 4 240 3135 1200 4200          ,@body))))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: condlet}
4 0 0 0 0 14 20 0.0000 4 240 8415 1200 2100 > (condlet (((= 1 2) (x (princ 'a)) (y (princ 'b)))
4 0 0 0 0 14 20 0.0000 4 240 7590 1200 2700             (t (x (princ 'e)) (z (princ 'f))))
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 3000     (list x y z)
4 0 0 0 0 14 20 0.0000 4 165 330 1200 3600 CD
4 0 0 0 0 14 20 0.0000 4 225 1485 1200 3900 (D C NIL)
4 0 0 0 0 14 20 0.0000 4 240 8415 1200 2400             ((= 1 1) (y (princ 'c)) (x (princ 'd)))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: condlet (suite)}
4 0 0 0 0 14 20 0.0000 4 240 6270 900 1800 (defmacro condlet (clauses &body body)
4 0 0 0 0 14 20 0.0000 4 240 3960 900 2100   (let ((bodfn (gensym))
4 0 0 0 0 14 20 0.0000 4 255 8910 900 2400         (vars (mapcar #'(lambda (v) (cons v (gensym)))
4 0 0 0 0 14 20 0.0000 4 240 6600 900 2700                       (remove-duplicates
4 0 0 0 0 14 20 0.0000 4 255 6105 900 3000                         (mapcar #'car
4 0 0 0 0 14 20 0.0000 4 255 9900 900 3300                                 (mappend #'cdr clauses))))))
4 0 0 0 0 14 20 0.0000 4 255 6930 900 3600     `(labels ((,bodfn ,(mapcar #'car vars)
4 0 0 0 0 14 20 0.0000 4 240 4125 900 3900                  ,@body))
4 0 0 0 0 14 20 0.0000 4 255 6105 900 4200        (cond ,@(mapcar #'(lambda (cl)
4 0 0 0 0 14 20 0.0000 4 225 9570 900 4500                            (condlet-clause vars cl bodfn))
4 0 0 0 0 14 20 0.0000 4 225 5775 900 4800                        clauses)))))
4 0 0 0 0 14 20 0.0000 4 255 6435 900 5700   `(,(car cl) (let ,(mapcar #'cdr vars)
4 0 0 0 0 14 20 0.0000 4 225 7425 900 6000                 (let ,(condlet-binds vars cl)
4 0 0 0 0 14 20 0.0000 4 255 8745 900 6300                   (,bodfun ,@(mapcar #'cdr vars))))))
4 0 0 0 0 14 20 0.0000 4 225 4950 900 6900 (defun condlet-binds (vars cl)
4 0 0 0 0 14 20 0.0000 4 255 4950 900 7200   (mapcar #'(lambda (bindform)
4 0 0 0 0 14 20 0.0000 4 240 5610 900 7500               (if (consp bindform)
4 0 0 0 0 14 20 0.0000 4 225 9405 900 7800                   (cons (cdr (assoc (car bindform) vars))
4 0 0 0 0 14 20 0.0000 4 225 6765 900 8100                         (cdr bindform))))
4 0 0 0 0 14 20 0.0000 4 225 3300 900 8400           (cdr cl)))
4 0 0 0 0 14 20 0.0000 4 225 6105 900 5400 (defun condlet-clause (vars cl bodfn)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: with-db}
4 0 0 0 0 14 20 0.0000 4 240 2970 1200 2100 (let ((temp *db*))
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 2400   (setq *db* db)
4 0 0 0 0 14 20 0.0000 4 225 2145 1200 2700   (lock *db*)
4 0 0 0 0 14 20 0.0000 4 240 3795 1200 3000   (prog1 (eval-query q)
4 0 0 0 0 14 20 0.0000 4 225 3795 1200 3300          (release *db*)
4 0 0 0 0 14 20 0.0000 4 240 4455 1200 3600          (setq *db* temp)))
4 0 0 0 0 14 20 0.0000 4 225 1815 1200 4800 (with-db db
4 0 0 0 0 14 20 0.0000 4 240 2805 1200 5100   (eval-query q))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: with-db (suite)}
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 2025 (defmacro with-db (db &body body)
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 2325   (let ((temp (gensym)))
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 2625     `(let ((,temp *db*))
4 0 0 0 0 14 20 0.0000 4 240 3630 1200 2925        (unwind-protect
4 0 0 0 0 14 20 0.0000 4 240 2475 1200 3225          (progn
4 0 0 0 0 14 20 0.0000 4 240 4290 1200 3525            (setq *db* ,db)
4 0 0 0 0 14 20 0.0000 4 225 3630 1200 3825            (lock *db*)
4 0 0 0 0 14 20 0.0000 4 240 2970 1200 4125            ,@body)
4 0 0 0 0 14 20 0.0000 4 240 2475 1200 4425          (progn
4 0 0 0 0 14 20 0.0000 4 225 4125 1200 4725            (release *db*)
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 5025            (setq *db* ,temp))))))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: with-db (suite)}
6 1200 1875 7800 6375
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 2100 (defmacro with-db (db &body body)
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 2400   (let ((gbod (gensym)))
4 0 0 0 0 14 20 0.0000 4 240 6435 1200 3000        (declare (dynamic-extent ,gbod))
4 0 0 0 0 14 20 0.0000 4 240 6105 1200 3300        (with-db-fn *db* ,db ,gbod))))
4 0 0 0 0 14 20 0.0000 4 240 6270 1200 3900 (defun with-db-fn (old-db new-db body)
4 0 0 0 0 14 20 0.0000 4 240 2805 1200 4200   (unwind-protect
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 4500     (progn
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 4800       (setq *db* new-db)
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 5100       (lock *db*)
4 0 0 0 0 14 20 0.0000 4 240 3465 1200 5400       (funcall body))
4 0 0 0 0 14 20 0.0000 4 240 1650 1200 5700     (progn
4 0 0 0 0 14 20 0.0000 4 225 3300 1200 6000       (release *db*)
4 0 0 0 0 14 20 0.0000 4 240 4455 1200 6300       (setq *db* old-db))))
4 0 0 0 0 14 20 0.0000 4 255 6600 1200 2700     `(let ((,gbod #'(lambda () ,@body)))
-6
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: macros anaphoriques}
4 0 0 0 0 14 20 0.0000 4 240 6105 1200 2400 (let ((it (complicated-calculation)))
4 0 0 0 0 14 20 0.0000 4 225 1320 1200 2700   (if it
4 0 0 0 0 14 20 0.0000 4 240 4620 1200 3000       (do-something-with it)
4 0 0 0 0 14 20 0.0000 4 240 5775 1200 3300       (do-something-else-with it)))
4 0 0 0 0 14 20 0.0000 4 240 4950 1200 4200 (aif (complicated-calculation)
4 0 0 0 0 14 20 0.0000 4 240 4455 1200 4500      (do-something-with it)
4 0 0 0 0 14 20 0.0000 4 240 5445 1200 4800      (do-something-else-with it))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: macros anaphoriques (suite)}
4 0 0 0 0 14 20 0.0000 4 240 9075 600 1425 (defmacro aif (test-form then-form &optional else-form)
4 0 0 0 0 14 20 0.0000 4 225 4125 600 1725   `(let ((it ,test-form))
4 0 0 0 0 14 20 0.0000 4 225 5940 600 2025      (if it ,then-form ,else-form)))
4 0 0 0 0 14 20 0.0000 4 240 6270 600 2625 (defmacro awhen (test-form &body body)
4 0 0 0 0 14 20 0.0000 4 225 2970 600 2925   `(aif ,test-form
4 0 0 0 0 14 20 0.0000 4 240 3960 600 3225         (progn ,@body)))
4 0 0 0 0 14 20 0.0000 4 240 5610 600 3825 (defmacro awhile (expr &body body)
4 0 0 0 0 14 20 0.0000 4 240 4125 600 4125   `(do ((it ,expr ,expr))
4 0 0 0 0 14 20 0.0000 4 225 2805 600 4425        ((not it))
4 0 0 0 0 14 20 0.0000 4 240 2145 600 4725      ,@body))
4 0 0 0 0 14 20 0.0000 4 240 4455 600 5325 (defmacro aand (&rest args)
4 0 0 0 0 14 20 0.0000 4 240 3795 600 5625   (cond ((null args) t)
4 0 0 0 0 14 20 0.0000 4 240 6270 600 5925         ((null (cdr args)) (car args))
4 0 0 0 0 14 20 0.0000 4 240 8580 600 6225         (t `(aif ,(car args) (aand ,@(cdr args))))))
4 0 0 0 0 14 20 0.0000 4 225 5115 600 6825 (defmacro acond (&rest clauses)
4 0 0 0 0 14 20 0.0000 4 225 3300 600 7125   (if (null clauses)
4 0 0 0 0 14 20 0.0000 4 180 1485 600 7425       nil
4 0 0 0 0 14 20 0.0000 4 240 4455 600 8025             (sym (gensym)))
4 0 0 0 0 14 20 0.0000 4 240 5445 600 8325         `(let ((,sym ,(car cl1)))
4 0 0 0 0 14 20 0.0000 4 240 3135 600 8625            (if ,sym
4 0 0 0 0 14 20 0.0000 4 225 7095 600 9225                (acond ,@(cdr clauses)))))))
4 0 0 0 0 14 20 0.0000 4 225 5115 600 7725       (let ((cl1 (car clauses))
4 0 0 0 0 14 20 0.0000 4 240 7260 600 8925                (let ((it ,sym)) ,@(cdr cl1))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Introduction à la programmation par objets avec CLOS}
4 1 0 0 0 18 24 0.0000 4 360 2100 6600 1335 (motivation)
4 0 0 0 0 18 20 0.0000 4 270 8955 1200 2700 La programmation ascendente est plus facile si les modules sont 
4 0 0 0 0 18 20 0.0000 4 270 4410 1200 3045 organisés par types de données
4 0 0 0 0 18 20 0.0000 4 270 9105 1200 3735 Pour améliorer la maintenabilité du code, il faut éviter la duplication
4 0 0 0 0 18 20 0.0000 4 270 9810 1200 4770 Le langages de programmation traditionnels ne peuvent pas représenter
4 0 0 0 0 18 20 0.0000 4 270 3645 1200 5115 cette organisation du code
4 0 0 0 0 18 20 0.0000 4 210 5400 1200 4080 de code.  Il faut donc factoriser le code 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: verrou (lock)}
4 0 0 0 0 18 20 0.0000 4 270 10890 1200 2100 Utilisé pour éviter un acces multiple à une ressource (imprimante, CD-ROM, etc)
4 0 0 0 0 18 20 0.0000 4 270 4215 1200 2790 Plusieurs types sont possibles
4 0 0 0 0 18 20 0.0000 4 270 5085 1200 3480 Utilisation uniforme (polymorphisme)
4 0 0 0 0 18 20 0.0000 4 270 7065 1200 4860 Pour simplifier:  deux types de verrou: simple et null
4 0 0 0 0 18 20 0.0000 4 270 3300 1200 4170 Chaque verrou a un nom
4 0 0 0 0 18 20 0.0000 4 270 10785 1200 5550 Opérations: verrouiller, déverrouiller, récupérer le nom, récupérer le propriétaire
4 0 0 0 0 18 20 0.0000 4 270 3060 1200 5895 (celui qui l'a verrouillé)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: verrou (suite)}
4 1 0 0 0 18 24 0.0000 4 360 5055 6600 1335 (version orientée opérations)
4 0 0 0 0 14 20 0.0000 4 240 5610 1200 3000 (defstruct simple-lock name owner)
4 0 0 0 0 14 20 0.0000 4 225 4290 1200 2400 (defstruct null-lock name)
4 0 0 0 0 14 20 0.0000 4 225 3795 1200 3600 (defun lock-name (lock)
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 3900   (typecase lock
4 0 0 0 0 14 20 0.0000 4 225 6105 1200 4200     (null-lock (null-lock-name lock))
4 0 0 0 0 14 20 0.0000 4 240 7095 1200 4500     (simple-lock (simple-lock-name lock))))
4 0 0 0 0 14 20 0.0000 4 225 3960 1200 5100 (defun lock-seize (lock)
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 5400   (typecase lock
4 0 0 0 0 14 20 0.0000 4 225 3135 1200 5700     (null-lock nil)
4 0 0 0 0 14 20 0.0000 4 240 8745 1200 6000     (simple-lock (setf (null-lock-owner lock) ...))))
4 0 0 0 0 14 20 0.0000 4 225 4290 1200 6600 (defun lock-release (lock)
4 0 0 0 0 14 20 0.0000 4 240 2640 1200 6900   (typecase lock
4 0 0 0 0 14 20 0.0000 4 225 3135 1200 7200     (null-lock nil)
4 0 0 0 0 14 20 0.0000 4 240 8745 1200 7500     (simple-lock (setf (null-lock-owner lock) nil))))
\vfill\end{slide}
%--------------------------------
\begin{slide}
2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2
	 5700 1919 5700 5519
4 1 0 0 0 18 24 0.0000 4 360 8190 6600 1244 Version souhaitée (mais pas possible sans OO)
4 0 0 0 0 14 20 0.0000 4 225 4290 600 2444 (defstruct null-lock name)
4 0 0 0 0 14 20 0.0000 4 225 3960 600 3044 (defun lock-seize (lock)
4 0 0 0 0 14 20 0.0000 4 225 990 600 3344   nil)
4 0 0 0 0 14 20 0.0000 4 225 4290 600 3944 (defun lock-release (lock)
4 0 0 0 0 14 20 0.0000 4 225 990 600 4244   nil)
4 0 0 0 0 14 20 0.0000 4 225 3795 4200 6044 (defun lock-name (lock)
4 0 0 0 0 14 20 0.0000 4 225 2970 4200 6344   (???-name lock))
4 0 0 0 0 14 20 0.0000 4 240 3630 6000 2444 (defstruct simple-lock
4 0 0 0 0 14 20 0.0000 4 225 2145 6000 2744   name owner)
4 0 0 0 0 14 20 0.0000 4 225 3960 6000 3344 (defun lock-seize (lock)
4 0 0 0 0 14 20 0.0000 4 225 4290 6000 4244 (defun lock-release (lock)
4 0 0 0 0 14 20 0.0000 4 240 6270 6000 4544   (setf (simple-lock-owner lock) nil))
4 0 0 0 0 14 20 0.0000 4 240 6270 6000 3644   (setf (simple-lock-owner lock) ...))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Introduction à la programmation orientée objets}
4 0 0 100 0 18 18 0.0000 4 285 9390 1200 2400 La programmation orientée objets à été conçue pour résoudre certains
4 0 0 100 0 18 18 0.0000 4 270 9885 1200 2745 problèmes de modularitè et de réutilisabilité dus à l'utilisation de langages
4 0 0 100 0 18 18 0.0000 4 270 7470 1200 3090 traditionnels (comme le C) pour l'écriture d'applications.
4 0 0 100 0 18 18 0.0000 4 270 7425 1200 4125 comprendre pour des programmeurs non expérimentés.
4 0 0 100 0 18 18 0.0000 4 270 9390 1200 4815 Pour éviter l'influence de la terminologie d'un langage particulier, nous
4 0 0 100 0 18 18 0.0000 4 270 10185 1200 5160 allons commencer par une discussion générale des notions de la conception
4 0 0 100 0 18 18 0.0000 4 270 5535 1200 5505 et de la programmation orientées objets.  
4 0 0 100 0 18 18 0.0000 4 270 9615 1200 6195 Puis, nos montrerons la correspondance entre ces notions et l'utilisation
4 0 0 100 0 18 18 0.0000 4 270 6480 1200 6540 de CLOS pour la programmation orientée objets.
4 0 0 100 0 18 18 0.0000 4 270 9810 1200 3780 Par conséquent, l'utilité de la programmation orientée objets est difficile à
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition: objet}
4 0 0 100 0 18 18 0.0000 4 270 9405 1200 2100 Un objet est une valeur qui peut être affectée à une variable, fournie en
4 0 0 100 0 18 18 0.0000 4 270 9540 1200 2445 tant qu'argument à une fonction, ou renvoyée par l'appel à une fonction.
4 0 0 100 0 18 18 0.0000 4 270 10230 1200 3135 Un objet a une identité.  Deux objets peuvent être comparés concernant leurs
4 0 0 100 0 18 18 0.0000 4 210 1230 1200 3480 identités.
4 0 0 100 0 18 18 0.0000 4 270 9585 1200 4170 Si la sémantique par références uniforme est utilisée, alors cette identité
4 0 0 100 0 18 18 0.0000 4 270 4050 1200 4515 est préservée par l'affectation.
4 0 0 100 0 18 18 0.0000 4 270 10455 1200 5550 mais des objets simples peuvent ne pas avoir de la mémoire allouée.  L'identité
4 0 0 100 0 18 18 0.0000 4 270 10185 1200 5895 et la sémantique peuvent quand-même être préservées, à condition que des 
4 0 0 100 0 18 18 0.0000 4 270 7260 1200 6240 effets de bord ne soient pas possibles sur ces objets. 
4 0 0 100 0 18 18 0.0000 4 270 10470 1200 5205 Souvent, un object est implémenté par un pointeur sur de l'espace en mémoire,
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition: type (abstrait)}
4 0 0 100 0 18 18 0.0000 4 270 8505 1200 2100 Un type abstrait (ou simplement type) est un ensemble d'objets. 
4 0 0 100 0 18 18 0.0000 4 270 8475 1200 6900 Par exemple, un objet de type voiture est aussi de type véhicule.
4 0 0 100 0 18 18 0.0000 4 270 8055 1200 5700 En particulier, un type peut être un sous type d'un autre type.
4 0 0 100 0 18 18 0.0000 4 270 5745 1200 4500 Un objet peut donc être de plusieurs types.
4 0 0 100 0 18 18 0.0000 4 270 7485 1200 3300 Les types ne sont pas forcement mutuellement exclusifs.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Opération}
4 0 0 100 0 18 18 0.0000 4 270 9045 1200 1800 Un opération est une fonction ou une procédure dont les arguments
4 0 0 100 0 18 18 0.0000 4 270 2145 1200 2145 sont des objets.
4 0 0 100 0 18 18 0.0000 4 270 5625 1200 2835 Chaque argument est d'un type particulier.
4 0 0 100 0 18 18 0.0000 4 270 9690 1200 3525 Par exemple, monter-moteur peut être une opération de deux arguments,
4 0 0 100 0 18 18 0.0000 4 270 10365 1200 3870 un objet de type véhicule à moteur et un objet de type moteur.  L'effet de bord
4 0 0 100 0 18 18 0.0000 4 270 7485 1200 4215 de cette opération est de changer le moteur du véhicule.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition: protocole}
6 1200 5100 11625 6075
4 0 0 100 0 18 18 0.0000 4 270 10365 1200 5325 Exemple:  Dessiner des objets graphiques.  Un tel protocole peut par exemple
4 0 0 100 0 18 18 0.0000 4 270 9645 1200 5670 contenir les opérations dessiner, effacer et déplacer, utilisant des objets
4 0 0 100 0 18 18 0.0000 4 270 6060 1200 6015 de type window, pixmap, cercle, rectangle, etc
-6
6 1200 3225 10575 3900
4 0 0 100 0 18 18 0.0000 4 270 9330 1200 3465 Typiquement, au moins un type est partagé entre toutes les opérations
4 0 0 100 0 18 18 0.0000 4 270 1800 1200 3810 du protocole.
-6
4 0 0 100 0 18 18 0.0000 4 270 8565 1200 1800 Un protocole est une collection d'opérations utilisées ensemble.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Classe}
4 0 0 100 0 18 18 0.0000 4 270 9705 1200 1800 Une classe est utilisée pour décrire les détails d'implémentation d'objets,
4 0 0 100 0 18 18 0.0000 4 270 7710 1200 2145 tels que le nombre et les noms des champs (ou créneaux).
4 0 0 100 0 18 18 0.0000 4 270 9750 1200 2835 Un type est typiquement constitué par un ensemble de classe qui peuvent
4 0 0 100 0 18 18 0.0000 4 270 8235 1200 3180 être relatées par l'héritage (mais qui ne le sont pas forcement)
4 0 0 100 0 18 18 0.0000 4 270 9390 1200 3870 Un objet est l'instance directe d'exactement une classe.  C'est la classe
4 0 0 100 0 18 18 0.0000 4 270 1410 1200 4215 de l'objet. 
4 0 0 100 0 18 18 0.0000 4 270 9570 1200 4905 Remarque:  on peut donc parler de la classe d'un objet mais pas du type
4 0 0 100 0 18 18 0.0000 4 270 1515 1200 5250 d'une objet
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition: Héritage}
4 0 0 100 0 18 18 0.0000 4 270 10005 1200 1800 Les classes sont organisées dans un graphe sans cycles (héritage multiple)
4 0 0 100 0 18 18 0.0000 4 270 4575 1200 2145 ou dans un arbre (héritage simple)
4 0 0 100 0 18 18 0.0000 4 270 9690 1200 2835 Un objet est instance de la classe C si et seulement si il est soit l'instance
4 0 0 100 0 18 18 0.0000 4 270 10050 1200 3180 directe de C ou instance d'une classe qui hérite de C (ou équivalent: qui est
4 0 0 100 0 18 18 0.0000 4 270 1875 1200 3525 dérivée de C).
4 0 0 100 0 18 18 0.0000 4 270 9690 1200 4215 Si un type contient la classe C, il contient aussi toutes les classe dérivées
4 0 0 100 0 18 18 0.0000 4 210 705 1200 4560 de C.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Programmation orientée objets avec CLOS}
4 1 0 100 0 18 24 0.0000 4 285 3495 6600 1335 Définition: Méthode
4 0 0 100 0 18 18 0.0000 4 270 8340 1200 2100 Une méthode est une implémentation partielle d'une opération.
4 0 0 100 0 18 18 0.0000 4 270 10095 1200 2790 L'implémentation est partielle, car la méthode l'implémente uniquement pour
4 0 0 100 0 18 18 0.0000 4 270 6150 1200 3135 des arguments instances de certaines classes.
4 0 0 100 0 18 18 0.0000 4 270 9240 1200 3825 Pour que l'opération soit complète, il faut que les méthodes couvrent 
4 0 0 100 0 18 18 0.0000 4 270 6555 1200 4170 l'ensemble des classes des types des arguments.
4 0 0 100 0 18 18 0.0000 4 270 9075 1200 4860 Les méthodes d'une opération peuvent être physiquement réparties.
4 0 0 100 0 18 18 0.0000 4 270 8160 1200 5550 Toutes les méthodes d'une seule opération ont le même nom.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Fonctions génériques}
4 0 0 100 0 18 18 0.0000 4 270 9870 1200 1800 Une fonction générique est une implémentation complète d'une opération.
4 0 0 100 0 18 18 0.0000 4 210 6135 1200 2490 Elle est utilisée comme une fonction ordinaire.
4 0 0 100 0 18 18 0.0000 4 270 9915 1200 3180 Une implémentation partielle (une méthode) est choisie selon la classe des
4 0 0 100 0 18 18 0.0000 4 255 1470 1200 3525 arguments.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Sélection}
4 0 0 100 0 18 18 0.0000 4 270 9150 1200 1800 Le mécanisme de sélection est responsable du choix d'une méthode 
4 0 0 100 0 18 18 0.0000 4 270 9015 1200 2145 particulière d'une fonction générique selon la classe des arguments
4 0 0 100 0 18 18 0.0000 4 270 9165 1200 2835 En CLOS, la sélection est multiple, à savoir, plusieurs arguments sont
4 0 0 100 0 18 18 0.0000 4 270 5745 1200 3180 utilisés pour déterminer la méthode choisie
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Héritage multiple}
4 0 0 100 0 18 18 0.0000 4 270 9570 1200 1800 C'est la possibilité en CLOS pour une classe d'être dérivée de plusieurs
4 0 0 100 0 18 18 0.0000 4 210 1965 1200 2145 autres classes.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Comparaison avec Java (et C++, Smalltalk, Eiffel, etc)}
4 1 0 100 0 18 24 0.0000 4 360 2850 6600 1335 Typage statique
4 0 0 100 0 18 18 0.0000 4 270 9840 1200 2400 Ces langages sont statiquement typés, ce qui veut dire que l'utilisateur est
4 0 0 100 0 18 18 0.0000 4 270 9840 1200 2745 obligé de déclarer la classe des variables et des arguments à une fonction
4 0 0 100 0 18 18 0.0000 4 270 1890 1200 3090 ou procédure.
4 0 0 100 0 18 18 0.0000 4 270 7800 1200 3780 Par conséquent, un type abstrait doit aussi être une classe.
4 0 0 100 0 18 18 0.0000 4 270 9180 1200 4470 On introduit donc souvent une classe racine (parfois sans instances) 
4 0 0 100 0 18 18 0.0000 4 270 5145 1200 4815 dont le nom est le nom du type abstrait
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Restrictions sur les opérations}
4 0 0 100 0 18 18 0.0000 4 270 10065 1200 1800 Tous ces langages ont la sélection simple, à savoir qu'une la méthode d'une
4 0 0 100 0 18 18 0.0000 4 270 10335 1200 2145 opération peut être déterminée uniquement par un seul argument (le premier).
4 0 0 100 0 18 18 0.0000 4 210 1620 1200 3180 des autres.  
4 0 0 100 0 18 18 0.0000 4 270 9450 1200 3870 Le premier argument est tellement différent que la syntaxe est spéciale:
4 0 0 100 0 18 18 0.0000 4 210 885 2400 4500 CLOS:
4 0 0 100 0 18 18 0.0000 4 270 4695 4200 4500 (mount-engine my-car the-engine)
4 0 0 100 0 18 18 0.0000 4 210 960 2400 5175 Autres:
4 0 0 100 0 18 18 0.0000 4 270 4575 4200 5520 the_engine.mount_engine(my_car)
4 0 0 100 0 18 18 0.0000 4 270 4995 4200 5175 my_car.mount_engine(the_engine) ou
4 0 0 100 0 18 18 0.0000 4 270 5145 4200 6300 selon si la sélection est souhaité par le
4 0 0 100 0 18 18 0.0000 4 270 4785 4200 6645 type de voiture ou le type de moteur
4 0 0 100 0 18 18 0.0000 4 270 9570 1200 7800 Cette syntaxe spéciale est responsable de l'impossibilité de passer une 
4 0 0 100 0 18 18 0.0000 4 270 6990 1200 8145 opération en tant qu'argument à une autre opération.
4 0 0 100 0 18 18 0.0000 4 270 9405 1200 2835 C'est pourquoi ces langages traitent le premier argument différemment
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Relations entre classe et méthodes}
4 0 0 100 0 18 18 0.0000 4 270 10095 1200 1800 Avec ces langages, la relation entre une classe et un unsemble de méthodes
4 0 0 100 0 18 18 0.0000 4 270 9645 1200 2145 est tellement forte que les méthodes sont physiqument à l'intérieur de la 
4 0 0 100 0 18 18 0.0000 4 210 2985 1200 2490 définition de la classe.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Héritage simple ou multiple}
4 0 0 100 0 18 18 0.0000 4 270 10860 1200 1800 Certains de ces langages ont l'héritage simple uniquement, par exemple Smalltalk.
4 0 0 100 0 18 18 0.0000 4 270 6750 1200 2490 Certains autres ont l'héritage multiple, comme C++.
4 0 0 100 0 18 18 0.0000 4 270 9180 1200 3180 Le langage Java à l'héritage simple plus la notion d'interface presque
4 0 0 100 0 18 18 0.0000 4 270 4110 1200 3525 équivalent à l'héritage multiple.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Terminologie CLOS}
4 0 0 0 0 18 20 0.0000 4 270 8475 1200 4515 La structure d'une instance est définie par les créneaux (slots)
4 0 0 0 0 18 20 0.0000 4 270 5325 1200 5550 Chaque créneau a un nom et une valeur
4 0 0 0 0 18 20 0.0000 4 270 5460 1200 4860 (similaires aux champs d'une structure) 
4 0 0 0 0 18 20 0.0000 4 270 9900 1200 6240 Un créneau est soit local (une valeur différente dans chaque instance) ou
4 0 0 0 0 18 20 0.0000 4 270 8385 1200 6585 partagé (une valeur commune pour l'ensemble des instances)
4 0 0 0 0 18 20 0.0000 4 270 9855 1200 7275 Une classe peut être définie comme une extension d'une autre classe ou
4 0 0 0 0 18 20 0.0000 4 270 10380 1200 7620 de plusieurs autres classes, appelées superclasses.   La nouvelle classe est
4 0 0 0 0 18 20 0.0000 4 270 5220 1200 7965 une sous-classe de ses superclasses
4 0 0 0 0 18 20 0.0000 4 270 8775 1200 2100 Un ensemble d'objets est représenté par un objet de type classe
4 0 0 0 0 18 20 0.0000 4 270 8475 1200 2790 Un objet dans l'ensemble est une instance directe de la classe
4 0 0 0 0 18 20 0.0000 4 270 9945 1200 3480 Chaque instance directe d'une classe a le même comportement, la même
4 0 0 0 0 18 20 0.0000 4 270 3450 1200 3825 structure et le même type
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Fonctions Génériques}
4 0 0 0 0 18 20 0.0000 4 270 10470 1200 2100 Une fonction générique est une définition d'interface et non d'implémentation
4 0 0 0 0 18 20 0.0000 4 270 10575 1200 2790 L'implementation d'une fonction générique est faite par zero, une ou plusieurs
4 0 0 0 0 18 20 0.0000 4 210 1365 1200 3135 méthodes
4 0 0 0 0 18 20 0.0000 4 270 10125 1200 3825 Le choix de la méthode à utiliser est déterminé par le types des arguments
4 0 0 0 0 18 20 0.0000 4 270 4995 1200 4170 (mécanisme de sélection (dispatch))
4 0 0 0 0 18 20 0.0000 4 270 8985 1200 4860 En CLOS, la sélection est déterminé par l'ensemble des argument 
4 0 0 0 0 18 20 0.0000 4 270 9960 1200 5205 (multiple dispatch, multi methods), alors que d'autres langages n'utilisent
4 0 0 0 0 18 20 0.0000 4 270 5655 1200 5550 que le premier argument pour la sélection
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple: verrou encore}
4 0 0 0 0 14 20 0.0000 4 225 2805 900 1575 (defclass lock ()
4 0 0 0 0 14 20 0.0000 4 240 7095 900 1875   ((name :initarg :name :reader lock-name))
4 0 0 0 0 14 20 0.0000 4 225 8250 900 2175   (:documentation "The foundation of all locks."))
4 0 0 0 0 18 20 0.0000 4 210 2520 900 3000 Nom de la classe: 
4 0 0 0 0 14 20 0.0000 4 180 660 5700 3000 lock
4 0 0 0 0 18 20 0.0000 4 270 3480 900 3600 Spécification de créneau:
4 0 0 0 0 14 20 0.0000 4 240 6435 5700 3600 (name :initarg :name :reader lock-name)
4 0 0 0 0 18 20 0.0000 4 210 2325 900 4200 Nom du créneau:
4 0 0 0 0 14 20 0.0000 4 135 660 5700 4200 name
4 0 0 0 0 18 20 0.0000 4 270 2670 900 4800 Option de créneau: 
4 0 0 0 0 14 20 0.0000 4 240 2310 5700 4800 :initarg :name
4 0 0 0 0 18 20 0.0000 4 270 1800 900 9300 Superclasse:
4 0 0 0 0 14 20 0.0000 4 180 660 5700 9300 lock
4 0 0 0 0 14 20 0.0000 4 240 7920 900 8700   (:documentation "A lock that is always free"))
4 0 0 0 0 14 20 0.0000 4 225 660 900 8400   ()
4 0 0 0 0 14 20 0.0000 4 225 4290 900 8100 (defclass null-lock (lock)
4 0 0 0 0 18 20 0.0000 4 270 2400 900 7200 Option de classe:
4 0 0 0 0 14 20 0.0000 4 225 3630 5700 7200 (:documentation "...")
4 0 0 0 0 18 20 0.0000 4 270 2595 900 5850 Option de créneau:
4 0 0 0 0 14 20 0.0000 4 180 2805 5700 5850 :reader lock-name
4 0 0 0 0 18 20 0.0000 4 270 4215 1500 5400 argument clé pour la création:  
4 0 0 0 0 18 20 0.0000 4 270 8910 1500 6300 nom d'une fonction générique à utiliser pour la lecture du créneau
4 0 0 0 0 14 20 0.0000 4 225 5940 6300 5400 (make-instance ... :name "the name")
4 0 0 0 0 14 20 0.0000 4 225 2640 1500 6750 (lock-name lock)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Exemple (suite)}
4 0 0 0 0 14 20 0.0000 4 240 4620 1200 1800 (defclass simple-lock (lock)
4 0 0 0 0 14 20 0.0000 4 225 7590 1200 2100   ((owner :initform nil :accessor lock-owner))
4 0 0 0 0 14 20 0.0000 4 240 9405 1200 2400   (:documentation "A lock that is either free or busy."))
4 0 0 0 0 18 20 0.0000 4 270 3420 1200 3600 Créneau supplementaire:
4 0 0 0 0 14 20 0.0000 4 135 825 6000 3600 owner
4 0 0 0 0 18 20 0.0000 4 270 6780 1800 4200 (par rapport aux créneaux de la superclasse lock)
4 0 0 0 0 18 20 0.0000 4 270 2595 1200 5100 Option de créneau:
4 0 0 0 0 14 20 0.0000 4 180 2145 6000 5100 :initform nil
4 0 0 0 0 18 20 0.0000 4 270 4830 1800 5700 valeur initiale par défaut du créneau
4 0 0 0 0 18 20 0.0000 4 270 2595 1200 6600 Option de créneau:
4 0 0 0 0 14 20 0.0000 4 180 3300 6000 6600 :accessor lock-owner
4 0 0 0 0 18 20 0.0000 4 270 9405 1800 7200 nom d'une fonction générique à utiliser pour la lecture et de l'écriture 
4 0 0 0 0 18 20 0.0000 4 210 1605 1800 7545 du créneau:
4 0 0 0 0 14 20 0.0000 4 225 2805 2700 8400 (lock-owner lock)
4 0 0 0 0 14 20 0.0000 4 240 6930 2700 9000 (setf (lock-owner lock) *current-process*)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Création d'instances}
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 2100 (setf *null-lock*
4 0 0 0 0 14 20 0.0000 4 225 7755 1200 2400   (make-instance 'null-lock :name "Null lock"))
4 0 0 0 0 14 20 0.0000 4 240 3135 1200 3000 (setf *simple-lock*
4 0 0 0 0 14 20 0.0000 4 240 8415 1200 3300   (make-instance 'simple-lock :name "Simple lock"))
4 0 0 0 0 18 20 0.0000 4 270 7215 1200 4500 Ne pas utiliser make-instance dans un module client.
4 0 0 0 0 18 20 0.0000 4 330 6300 1200 4845 \311crire une fonction spécifique pour la création
4 0 0 0 0 14 20 0.0000 4 225 4620 1200 5700 (defun make-null-lock (name)
4 0 0 0 0 14 20 0.0000 4 225 6600 1200 6000   (make-instance 'null-lock :name name))
4 0 0 0 0 14 20 0.0000 4 240 4950 1200 6600 (defun make-simple-lock (name)
4 0 0 0 0 14 20 0.0000 4 240 6930 1200 6900   (make-instance 'simple-lock :name name))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Fonctions génériques}
4 0 0 0 0 14 20 0.0000 4 240 3960 1200 2100 (defgeneric seize (lock)
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 2400   (:documentation
4 0 0 0 0 14 20 0.0000 4 240 7260 1200 3000 Return the lock when the operation succeeds.
4 0 0 0 0 14 20 0.0000 4 240 8580 1200 3300 Some locks simply wait until they can succeed, while
4 0 0 0 0 14 20 0.0000 4 240 6435 1200 3600 other locks return NIL if they fail."))
4 0 0 0 0 14 20 0.0000 4 180 2640 1200 2700 "Seize the lock.
4 0 0 0 0 14 20 0.0000 4 240 8085 1200 4500 (defgeneric release (lock &optional failure-mode)
4 0 0 0 0 14 20 0.0000 4 225 2805 1200 4800   (:documentation
4 0 0 0 0 14 20 0.0000 4 240 9735 1200 5100 "Release the lock if it is currently owned by this process.
4 0 0 0 0 14 20 0.0000 4 240 5775 1200 5400 Return T if the operation succeeds.
4 0 0 0 0 14 20 0.0000 4 225 9570 1200 5700 If unsuccessful and failure-mode is :no-error, return NIL.
4 0 0 0 0 14 20 0.0000 4 240 9735 1200 6000 If unsuccessful and failure-mode is :error, signal an error
4 0 0 0 0 14 20 0.0000 4 225 7425 1200 6300 The default for failure-mode is :no-error."))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Les méthodes}
4 0 0 0 0 14 20 0.0000 4 225 5280 1200 2100 (defmethod seize ((l null-lock))
4 0 0 0 0 14 20 0.0000 4 240 5115 1200 2400   l)  ; return lock, no waiting
4 0 0 0 0 14 20 0.0000 4 240 9405 1200 3000 (defmethod release ((l null-lock) &optional failure-mode)
4 0 0 0 0 14 20 0.0000 4 240 10395 1200 3300   (declare (ignore failure-mode))  ; never fails for null locks
4 0 0 0 0 14 20 0.0000 4 225 660 1200 3600   t)
4 0 0 0 0 18 20 0.0000 4 270 9735 1200 5100 La liste des argument (lambda list) contient des paramètres spécialisés
4 0 0 0 0 18 20 0.0000 4 270 2175 1200 5445 par des classes
4 0 0 0 0 18 20 0.0000 4 270 9690 1200 6135 Une méthode est applicable uniquement si la restriction sur les classes
4 0 0 0 0 18 20 0.0000 4 210 1560 1200 6480 est vérifiée.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Les méthodes (suite)}
4 0 0 0 0 18 20 0.0000 4 270 5115 1200 2100 On suppose l'existance de primitives:
4 0 0 0 0 18 20 0.0000 4 270 7830 2400 2700 without-process-preemption (pour l'exécution atomique)
4 0 0 0 0 18 20 0.0000 4 270 7035 2400 3045 process-wait (attendre la valeur vrai d'une fonction)
4 0 0 0 0 18 20 0.0000 4 270 5685 2400 3390 *current-process* (le processus courant)
4 0 0 0 0 14 20 0.0000 4 240 8910 1200 4800 ;; If value of place is old-value, set it to new-value
4 0 0 0 0 14 20 0.0000 4 225 7425 1200 5100 ;; Return T if the setf worked, nil otherwise
4 0 0 0 0 14 20 0.0000 4 240 7425 1200 5400 (defmacro setf-if (place old-value new-value)
4 0 0 0 0 14 20 0.0000 4 240 4950 1200 5700   `(without-process-preemption
4 0 0 0 0 14 20 0.0000 4 240 5775 1200 6000      (cond ((eql ,place ,old-value)
4 0 0 0 0 14 20 0.0000 4 240 5940 1200 6300             (setf ,place ,new-value)
4 0 0 0 0 14 20 0.0000 4 225 2310 1200 6600             t)
4 0 0 0 0 14 20 0.0000 4 225 3465 1200 6900            (t nil))))
4 0 0 0 0 14 20 0.0000 4 240 8745 1200 7800 (defmethod check-for-mylock ((l simple-lock) process)
4 0 0 0 0 14 20 0.0000 4 240 5940 1200 8100   (when (eql (lock-owner l) process)
4 0 0 0 0 14 20 0.0000 4 240 9900 1200 8400     (error "Can't seize ~A because you already own it." l)))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Sauts non locaux}
4 0 0 100 0 18 18 0.0000 4 285 9210 1200 1800 Un façon d'abandonner l'exécution actuelle et de continuer à un autre
4 0 0 100 0 18 18 0.0000 4 270 2700 1200 2145 point du programme
4 0 0 100 0 18 18 0.0000 4 270 4680 1200 2835 Trois types:  go, return-from, throw
4 0 0 100 0 18 18 0.0000 4 270 9840 1200 3525 Le contenu de la pile entre le sommet et la cible du transfert et abandonné
4 0 0 100 0 18 18 0.0000 4 270 9375 1200 3870 (y compris les liens dynamiques de variables spéciales, tags "catch", et
4 0 0 100 0 18 18 0.0000 4 270 3075 1200 4215 traitants de conditions)
4 0 0 100 0 18 18 0.0000 4 270 7920 1200 4905 Les formes protégées par "unwind-protect" sont exécutées
4 0 0 100 0 18 18 0.0000 4 210 4170 1200 5595 Contr\364le est transferé à la cible
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{catch/throw}
4 0 0 100 0 18 18 0.0000 4 270 8025 1200 1800 catch est utilisé pour établir une étiquette à utiliser par throw
4 0 0 100 0 18 18 0.0000 4 270 7515 1200 3180 puis une suite de formes est évaluée, comme avec progn
4 0 0 100 0 18 18 0.0000 4 270 10890 1200 2490 l'étiquette peut être n'importe quel objet (mais c'est souvent un symbole constant)
4 0 0 100 0 18 18 0.0000 4 210 735 1200 4560 throw
4 0 0 100 0 18 18 0.0000 4 270 8205 1200 3870 si pendant l'évaluation des formes, il y a un throw à l'étiquette,
4 0 0 100 0 18 18 0.0000 4 270 9960 1200 4215 alors l'évaluation est abandonnée et catch renvoie les valeurs envoyées par
4 0 0 100 0 14 18 0.0000 4 225 2475 1200 5100 * (defun f (x) 
4 0 0 100 0 14 18 0.0000 4 225 3795 1200 5400     (throw 'hello 345))
4 0 0 100 0 14 18 0.0000 4 165 165 1200 6000 F
4 0 0 100 0 14 18 0.0000 4 240 2310 1200 6300 * (defun g (a)
4 0 0 100 0 14 18 0.0000 4 225 2805 1200 6600     (catch 'hello
4 0 0 100 0 14 18 0.0000 4 240 2805 1200 6900       (print 'hi)
4 0 0 100 0 14 18 0.0000 4 225 1815 1200 7200       (f a)
4 0 0 100 0 14 18 0.0000 4 240 3960 1200 7500       (print 'bonjour)))
4 0 0 100 0 14 18 0.0000 4 165 165 1200 8100 G
4 0 0 100 0 14 18 0.0000 4 240 1485 8100 5100 * (g 234)
4 0 0 100 0 14 18 0.0000 4 165 165 8100 5700 A
4 0 0 100 0 14 18 0.0000 4 180 495 8100 6000 345
4 0 0 100 0 14 18 0.0000 4 180 330 8100 6300 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{return-from}
4 0 0 100 0 18 18 0.0000 4 270 4020 1200 1800 Similaire à break du langage C
4 0 0 100 0 14 18 0.0000 4 180 495 1200 4200 234
4 0 0 100 0 14 18 0.0000 4 180 330 1200 4500 * 
4 0 0 100 0 14 18 0.0000 4 225 3135 1200 3000     (list 'a 'b 'c)
4 0 0 100 0 14 18 0.0000 4 225 4455 1200 3300     (return-from hello 234)
4 0 0 100 0 14 18 0.0000 4 225 3795 1200 3600     (error "an error"))
4 0 0 100 0 14 18 0.0000 4 225 2310 1200 2700 * (block hello
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Situations exceptionnelles}
4 0 0 100 0 18 18 0.0000 4 270 2550 1200 1800 Il y en a trois types:
4 0 0 100 0 18 18 0.0000 4 270 3765 1500 3600 L'épuisement de ressources
4 0 0 100 0 18 18 0.0000 4 210 1380 1500 4800 Les autres
4 0 0 100 0 18 18 0.0000 4 270 8910 1800 5400 Ce sont des situations normales, prévues par le programmeur, mais
4 0 0 100 0 18 18 0.0000 4 270 8580 1800 5745 dont le traitement nécessite une structure de cont\364le particulière
4 0 0 100 0 18 18 0.0000 4 210 1500 1500 2400 Les échecs
4 0 0 100 0 18 18 0.0000 4 270 7890 1800 3000 Ce sont des situations dues aux défauts de programmation.
4 0 0 100 0 18 18 0.0000 4 270 8715 1800 4200 C'est quand il n'y a plus de mémoire ou quand le disque est plein.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Les échecs}
4 0 0 100 0 18 18 0.0000 4 270 2085 1200 1800 Il n'y rien à faire
4 0 0 100 0 18 18 0.0000 4 270 5940 1200 2490 Il faut arrêter l'exécution le plus vite possible
4 0 0 100 0 18 18 0.0000 4 270 7875 1200 3180 Avec la macro "assert", on peut parfois tester les échecs et 
4 0 0 100 0 18 18 0.0000 4 270 8385 1200 4215 Il ne sert à rien de faire mieux, car on ne sait pas dans quel état 
4 0 0 100 0 18 18 0.0000 4 270 3135 1200 4560 se trouve le programme
4 0 0 100 0 18 18 0.0000 4 270 8760 1200 5250 La macro "assert" est aussi une bonne méthode pour documenter 
4 0 0 100 0 18 18 0.0000 4 270 3690 1200 5595 l'interface d'un type abstrait
4 0 0 100 0 18 18 0.0000 4 330 8715 1200 6285 \300 l'aide du compilateur, on peut supprimer les tests quand on est 
4 0 0 100 0 18 18 0.0000 4 270 4125 1200 6630 "s\373r" qu'il n'y a plus de défauts
4 0 0 100 0 18 18 0.0000 4 270 8205 1200 7320 Il est souvent meiux de les laisser (sauf ceux qui co\373tent cher)
4 0 0 100 0 18 18 0.0000 4 270 5985 1200 3525 arrêter l'exécution avec un message standard
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{L'épuisement de ressources}
4 0 0 100 0 18 18 0.0000 4 270 6900 1200 1800 Dans un programme non interactif, facile à relancer, 
4 0 0 100 0 18 18 0.0000 4 270 7560 1200 2145 arrêter l'exécution avec un message destiné à l'utilisateur
4 0 0 100 0 18 18 0.0000 4 270 6270 1200 2490 (et non comme assert destiné au programmeur)
4 0 0 100 0 18 18 0.0000 4 270 7230 1200 3300 Dans un programme interactif, c'est un peu trop brutal.
4 0 0 100 0 18 18 0.0000 4 270 8010 1200 3645 Relancer la boucle d'intercation après un message indiquant
4 0 0 100 0 18 18 0.0000 4 270 5655 1200 3990 comment faire pour libérer des ressources
4 0 0 100 0 18 18 0.0000 4 270 9315 1200 4800 La programmation dans le cas interactif est très délicate.  Il ne faut pas
4 0 0 100 0 18 18 0.0000 4 270 8955 1200 5145 que le message ou les commandes pour la libération de ressources
4 0 0 100 0 18 18 0.0000 4 270 8580 1200 5490 nécessitent de la ressource épuisée (l'affichage peut nécessiter 
4 0 0 50 0 18 18 0.0000 4 270 3735 1200 5835 de la mémoire, par exemple)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Les autres}
4 0 0 100 0 18 18 0.0000 4 270 7485 1200 1800 Ouverture d'un fichier qui n'existe pas, mais c'est normal
4 0 0 100 0 18 18 0.0000 4 270 9990 1200 2490 Parcour d'un tableau à la recherche d'un élément particulier, et on l'a trouvé
4 0 0 100 0 18 18 0.0000 4 270 10275 1200 3180 Tentative de reculer d'un caractère, alors que le point est au début du tampon
4 0 0 100 0 18 18 0.0000 4 270 8925 1200 3870 Multiplication d'une suite de nombres, et l'un des nombres est zéro
4 0 0 100 0 18 18 0.0000 4 210 645 1200 4560 Etc...
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Le problème des situations exceptionnelles}
4 0 0 100 0 18 18 0.0000 4 270 7965 1200 2100 La situation est souvent détectée par du code de bas niveau
4 0 0 100 0 18 18 0.0000 4 270 10665 1200 2790 Mais c'est du code haut niveau qui possède la connaissance pour son traitement
4 0 0 100 0 18 18 0.0000 4 270 5790 1200 3600 Exemple (ouverture de fichier non existant):
4 0 0 100 0 18 18 0.0000 4 270 6795 1800 4200 Le problème est détecté par open (très bas niveau)
4 0 0 100 0 18 18 0.0000 4 270 6990 1800 5235 fichier utilisateur c'est une situation de type "autre".  
4 0 0 100 0 18 18 0.0000 4 210 7680 1800 4890 Si c'est un fichier d'installation c'est un défaut.  Si c'est un
4 0 0 100 0 18 18 0.0000 4 270 8895 1200 6300 Il faut donc communiquer le problème du bas niveau au haut niveau
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Conditions}
4 0 0 100 0 18 18 0.0000 4 270 9360 1200 1800 Une condition est une instance (direct ou non) de la classe "condition"
4 0 0 100 0 18 18 0.0000 4 270 5130 1200 2490 C'est donc un objet avec des créneaux
4 0 0 100 0 18 18 0.0000 4 270 6360 1200 3180 Une condition est signalée à un traitant éventuel
4 0 0 100 0 18 18 0.0000 4 270 9660 1200 3870 Le traitant est une fonction (ordinaire ou générique) d'un seul argument, 
4 0 0 100 0 18 18 0.0000 4 210 1560 1200 4215 la condition
4 0 0 100 0 18 18 0.0000 4 270 9255 1200 4905 Le traitant est associé à un type de conditions, et le traitant est appelé
4 0 0 100 0 18 18 0.0000 4 270 5445 1200 5250 seulement si la condition est du bon type
4 0 0 100 0 18 18 0.0000 4 210 8190 1200 5940 Pour définir des sous classes de la classe "condition" utiliser 
4 0 0 100 0 18 18 0.0000 4 210 4395 1200 6285 define-condition et non defclass
4 0 0 100 0 18 18 0.0000 4 240 7485 1200 6975 Pour créer une instance de la classe "condition", utiliser 
4 0 0 100 0 18 18 0.0000 4 210 5070 1200 7320 make-condition et non make-instance
4 0 0 100 0 18 18 0.0000 4 270 9615 1200 8010 Plusieurs types de conditions existent:  arithmetic-error, end-of-file, . . .
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Conditions (suite)}
1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2100 8250 75 75 2100 8250 2100 8175
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 1500 4800 2700 4800 2700 9000 1500 9000 1500 4800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
	0 0 1.00 60.00 120.00
	 2100 8250 3000 8250
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 1500 8400 2700 8400
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 1500 7800 2700 7800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 1500 7200 2700 7200
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 1500 5400 2700 5400
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 9000 4800 10200 4800 10200 9000 9000 9000 9000 4800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 9000 8400 10200 8400
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 9000 7800 10200 7800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 9000 7200 10200 7200
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
	 9000 5400 10200 5400
2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
	 9000 4800 10200 4800 10200 4125 9000 4125 9000 4800
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 3
	0 0 1.00 60.00 120.00
	 9600 4500 10800 4500 10800 7725
3 3 0 1 0 7 100 0 -1 0.000 0 0 0 7
	 3000 8250 3000 7800 3525 7725 4125 7800 4125 8400 3525 8925
	 3075 8700
	 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
3 3 0 1 0 7 100 0 -1 0.000 0 0 0 7
	 10500 8250 10500 7800 11025 7725 11625 7800 11625 8400 11025 8925
	 10575 8700
	 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
4 0 0 100 0 18 18 0.0000 4 270 7305 1200 1800 La signalisation d'une condition se fait en deux étapes:
4 0 0 100 0 18 18 0.0000 4 270 9870 2100 2700 1. La recherche d'un traitant actif associé au type de la condition à signaler
4 0 0 100 0 18 18 0.0000 4 270 4005 2100 3390 2. Le traitant trouvé est appelé
4 1 0 100 0 18 18 0.0000 4 210 915 3600 8325 traitant
4 1 0 100 0 18 18 0.0000 4 210 915 11100 8325 traitant
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Conditions (suite)}
4 0 0 100 0 18 18 0.0000 4 270 5895 1200 1800 Les traitant est désactivé avant d'être appelé
4 0 0 100 0 18 18 0.0000 4 270 6420 1200 2490 La pile est intacte pendant l'exécution du traitant
4 0 0 100 0 18 18 0.0000 4 270 8295 1200 3180 Ceci permet d'examiner la pile par le debugger et de continuer
4 0 0 100 0 18 18 0.0000 4 270 5820 1200 3525 l'exécution du programme dans certains cas
4 0 0 100 0 18 18 0.0000 4 270 2085 1200 4215 Le traitant peut:
4 0 0 100 0 18 18 0.0000 4 285 7050 1800 5100 1. refuser (decline).  Pour ça, il retourne normalement
4 0 0 100 0 18 18 0.0000 4 285 6045 1800 5790 2. traiter.  Pour ça, il exécute un saut non local
4 0 0 100 0 18 18 0.0000 4 270 8880 1800 6480 3. reporter la décision. Il peut par exemple appeler le debugger, ou
4 0 0 100 0 18 18 0.0000 4 270 3795 1800 6825 signaler une autre condition.
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Conditions (suite)}
4 0 0 100 0 18 18 0.0000 4 210 8040 1200 1800 Les traitants sont établis avec handler-bind ou handler-case
4 0 0 100 0 18 18 0.0000 4 270 8055 1200 2490 Pour signaler, on utilise signal, warn, error, cerror, assert, etc
4 0 0 50 0 14 20 0.0000 4 225 5445 1200 3300 * (define-condition zero-found ()
4 0 0 50 0 14 20 0.0000 4 225 1155 1200 3600     ())
4 0 0 50 0 14 20 0.0000 4 165 1650 1200 4200 ZERO-FOUND
4 0 0 50 0 14 20 0.0000 4 240 4620 1200 4500 * (defun multiply-leaves (l)
4 0 0 50 0 14 20 0.0000 4 255 10395 1200 4800     (cond ((consp l) (reduce #'* (mapcar #'multiply-leaves l)))
4 0 0 50 0 14 20 0.0000 4 240 6930 1200 5100           ((zerop l) (signal 'zero-found))
4 0 0 50 0 14 20 0.0000 4 225 2805 1200 5400           (t l)))
4 0 0 50 0 14 20 0.0000 4 165 2475 1200 6000 MULTIPLY-LEAVES
4 0 0 50 0 14 20 0.0000 4 180 660 1200 6900 5040
4 0 0 50 0 14 20 0.0000 4 225 3630 1200 7500     (zero-found () 0))
4 0 0 50 0 14 20 0.0000 4 240 7590 1200 6300 * (multiply-leaves '((1 2 (3 4)) (((5 6))) 7))
4 0 0 50 0 14 20 0.0000 4 240 10890 1200 7200 * (handler-case (multiply-leaves '((1 2 (3 0)) (((5 6))) "hello"))
4 0 0 50 0 14 20 0.0000 4 180 165 1200 8100 0
4 0 0 50 0 14 20 0.0000 4 180 330 1200 8400 * 
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Spécifications de types}
4 0 0 100 0 18 20 0.0000 4 210 870 1200 2100 Utilité:
4 0 0 100 0 18 20 0.0000 4 270 2655 2100 3000 Vérification de type
4 0 0 100 0 18 20 0.0000 4 270 4155 2100 3690 Optimisation de la compilation
4 0 0 100 0 18 20 0.0000 4 270 3765 2100 4380 Représentation de données
4 0 0 100 0 18 20 0.0000 4 270 4710 2100 4725 (tableaux de bits, flots d'octets, ...)
4 0 0 100 0 18 20 0.0000 4 270 6855 1200 5700 Les types simples sont indiqués par des symbols.
4 0 0 100 0 18 20 0.0000 4 270 8775 1200 6390 Les types simples forment une arborescence (ou plut\364t un DAG)
4 0 0 100 0 18 20 0.0000 4 270 8895 1200 7080 Le type simple le plus général est t (un objet et toujours de type t)
4 0 0 100 0 18 20 0.0000 4 270 9135 1200 7770 Le type simple le mois général est nil (aucun objet n'est de type nil)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Types non simples}
4 0 0 100 0 18 20 0.0000 4 270 8760 1200 2100 On peut construire une spécification de type pour n'importe quel
4 0 0 100 0 18 20 0.0000 4 270 2520 1200 2445 ensemble d'objets
4 0 0 100 0 18 20 0.0000 4 270 1290 1200 3135 Exemple:
4 0 0 100 0 14 20 0.0000 4 225 8250 1800 3900 (or vector (and list (not (satisfies circular?))))
4 0 0 100 0 14 20 0.0000 4 240 2475 1800 4500 (integer 1 100)
4 0 0 100 0 18 20 0.0000 4 270 7365 1200 5400 Possibilité d'indiquer le type contenu dans un tableau:
4 0 0 100 0 14 20 0.0000 4 240 3465 1800 6300 (simple-array fixnum)
4 0 0 100 0 14 20 0.0000 4 240 8415 1800 6900 (make-array (list height width) :element-type 'bit)
4 0 0 100 0 18 20 0.0000 4 270 6135 1200 7800 Certains éléments du type peuvent être omis:
4 0 0 100 0 14 20 0.0000 4 240 4455 1800 8700 (simple-array fixnum (* *))
4 0 0 100 0 14 20 0.0000 4 240 3795 1800 9300 (simple-array fixnum *)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Définition de nouveaux noms de types}
4 0 0 100 0 18 20 0.0000 4 270 7245 1200 2100 Utilisation de la macro deftype (similaire à defmacro)
4 0 0 100 0 14 20 0.0000 4 240 2970 2100 3000 (deftype proseq ()
4 0 0 100 0 14 20 0.0000 4 225 8910 2100 3300   '(or vector (and list (not (satisfies circular?)))))
4 0 0 100 0 14 20 0.0000 4 255 3960 2100 3900 > (typep #(1 2) 'proseq)
4 0 0 100 0 14 20 0.0000 4 165 165 2100 4200 T
4 0 0 100 0 18 20 0.0000 4 270 4770 1200 5100 Paramétragre avec des arguments:
4 0 0 100 0 14 20 0.0000 4 240 3960 2100 6000 (deftype multiple-of (n)
4 0 0 100 0 14 20 0.0000 4 240 6435 2100 6300   `(and integer (satisfies (lambda (x) 
4 0 0 100 0 14 20 0.0000 4 240 8415 2100 6600                              (zerop (mod x ,n))))))
4 0 0 100 0 14 20 0.0000 4 240 4785 2100 7200 > (typep 12 '(multiple-of 4))
4 0 0 100 0 14 20 0.0000 4 165 165 2100 7500 T
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Flots binaires}
4 0 0 100 0 14 20 0.0000 4 240 2475 1200 2100 (with-open-file
4 0 0 100 0 14 20 0.0000 4 240 5610 1200 2400   (input filename :direction input
4 0 0 100 0 14 20 0.0000 4 240 7755 1200 2700                   :element-type 'unsigned-byte)
4 0 0 100 0 14 20 0.0000 4 30 825 1200 3000   ...
4 0 0 100 0 14 20 0.0000 4 240 3135 1200 3300   (read-byte input)
4 0 0 100 0 14 20 0.0000 4 30 825 1200 3600   ...
4 0 0 100 0 14 20 0.0000 4 225 990 1200 3900   ...)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Read macros}
4 0 0 0 0 18 20 0.0000 4 270 7755 1200 2100 Possibilité de programmer la fonction de lecture de code
4 0 0 0 0 18 20 0.0000 4 210 7740 1200 2790 Association entre un caractère est une fonction arbitraire
4 0 0 0 0 18 20 0.0000 4 270 7935 1200 3480 Les caractères ' (quote) et ` (anti quote) sont implémentés 
4 0 0 0 0 18 20 0.0000 4 210 3525 1200 3825 en utilisant ce mécanisme
4 0 0 0 0 14 20 0.0000 4 240 3960 2400 4800 (set-macro-character #\\'
4 0 0 0 0 14 20 0.0000 4 240 4125 2400 5100   #'(lambda (stream char)
4 0 0 0 0 14 20 0.0000 4 240 8250 2400 5400       (list (quote quote) (read stream t nil t))))
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Read macros (suite)}
4 0 0 0 0 18 20 0.0000 4 210 6960 1200 2100 Possibilité de définier des caractères similaires à #
4 0 0 0 0 18 20 0.0000 4 270 4170 1200 2445 (mais pas souvent nécessaire)
4 0 0 0 0 18 20 0.0000 4 270 8505 1200 3135 Possibilité de rajouter un deuxième caractère à # (ou similaire)
4 0 0 0 0 18 20 0.0000 4 270 4965 1200 3480 avec set-dispatch-macro-character
4 0 0 0 0 14 20 0.0000 4 255 6105 2100 4500 (set-dispatch-macro-character #\\# #\\?
4 0 0 0 0 14 20 0.0000 4 240 5280 2100 4800   #'(lambda (stream char1 char2)
4 0 0 0 0 14 20 0.0000 4 240 2970 2100 5100       (list 'quote
4 0 0 0 0 14 20 0.0000 4 225 4620 2100 5400             (let ((lst nil))
4 0 0 0 0 14 20 0.0000 4 225 8910 2100 5700               (dotimes (i (+ (read stream t nil t) 1))
4 0 0 0 0 14 20 0.0000 4 240 4785 2100 6000                 (push i lst))
4 0 0 0 0 14 20 0.0000 4 225 5280 2100 6300               (nreverse lst)))))
4 0 0 0 0 14 20 0.0000 4 210 825 2100 6900 > #?7
4 0 0 0 0 14 20 0.0000 4 225 2805 2100 7200 (0 1 2 3 4 5 6 7)
4 0 0 0 0 18 20 0.0000 4 270 7665 1200 8400 caractères réservés au programmeur:  #!, #?, #[, #], #{, #}
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Read macros (suite)}
4 0 0 0 0 18 20 0.0000 4 210 2475 1200 2100 Création de listes:
4 0 0 0 0 14 20 0.0000 4 255 8415 1800 3300 (set-macro-character #\\} (get-macro-character #\\)))
4 0 0 0 0 14 20 0.0000 4 255 6105 1800 3900 (set-dispatch-macro-character #\\# #\\{
4 0 0 0 0 14 20 0.0000 4 240 5280 1800 4200   #'(lambda (stream char1 char2)
4 0 0 0 0 14 20 0.0000 4 225 3795 1800 4500       (let ((accum nil)
4 0 0 0 0 14 20 0.0000 4 255 8910 1800 4800             (pair (read-delimited-list #\\} stream t)))
4 0 0 0 0 14 20 0.0000 4 240 5940 1800 5100         (do ((i (car pair) (+ i 1)))
4 0 0 0 0 14 20 0.0000 4 240 4950 1800 5400             ((> i (cadr pair))
4 0 0 0 0 14 20 0.0000 4 240 7260 1800 5700              (list 'quote (nreverse accum)))
4 0 0 0 0 14 20 0.0000 4 240 4620 1800 6000           (push i accum)))))
4 0 0 0 0 14 20 0.0000 4 240 1320 1800 6600 > #{2 7}
4 0 0 0 0 14 20 0.0000 4 225 2145 1800 6900 (2 3 4 5 6 7)
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Packages}
4 0 0 0 0 18 20 0.0000 4 270 4755 1200 2100 Pour traduire un nom à un symbole
4 0 0 0 0 18 20 0.0000 4 270 4560 1200 2790 Package courant dans *package*
4 0 0 0 0 18 20 0.0000 4 270 5280 1200 3480 Le package courant est utilisé par read
4 0 0 0 0 18 20 0.0000 4 270 7425 1200 4170 Initalement, le package courant est common-lisp-user
4 0 0 0 0 18 20 0.0000 4 270 5880 1200 4860 Fonctions package-name et find-package:
4 0 0 0 0 14 20 0.0000 4 240 4290 2100 5700 > (package-name *package*)
4 0 0 0 0 14 20 0.0000 4 180 2970 2100 6000 "COMMON-LISP-USER"
4 0 0 0 0 14 20 0.0000 4 240 5775 2100 6300 > (find-package "COMMON-LISP-USER")
4 0 0 0 0 14 20 0.0000 4 255 5940 2100 6600 #<The COMMON-LISP-USER package, ...>
4 0 0 0 0 18 20 0.0000 4 270 8850 1200 7200 Fonction symbol-package pour obtenir le package d'un symbole
4 0 0 0 0 14 20 0.0000 4 240 3795 2100 7800 > (symbol-package 'sym)
4 0 0 0 0 14 20 0.0000 4 255 5940 2100 8100 #<The COMMON-LISP-USER package, ...>
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Packages (suite)}
4 0 0 0 0 18 20 0.0000 4 270 4995 1200 2100 Création et changement de package:
4 0 0 0 0 14 20 0.0000 4 240 2475 2100 3000 > (setf sym 99)
4 0 0 0 0 14 20 0.0000 4 180 330 2100 3300 99
4 0 0 0 0 14 20 0.0000 4 240 6105 2100 3600 > (setf *package* (make-package 'mine
4 0 0 0 0 14 20 0.0000 4 240 8745 2100 3900                                 :use '(common-lisp)))
4 0 0 0 0 14 20 0.0000 4 255 3960 2100 4200 #<The MINE package, ...>
4 0 0 0 0 14 20 0.0000 4 210 825 2100 4500 > sym
4 0 0 0 0 14 20 0.0000 4 180 6105 2100 4800 Error ... The variable SYM is unbound
4 0 0 0 0 14 20 0.0000 4 240 3795 2100 5100 > common-lisp-user::sym
4 0 0 0 0 14 20 0.0000 4 180 330 2100 5400 99
4 0 0 0 0 18 20 0.0000 4 270 2985 1200 6300 \311viter l'utilisation de ::
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Packages (suite)}
4 0 0 0 0 18 20 0.0000 4 270 5205 1200 1800 Utiliser plut\364t le concept d'exportation
4 0 0 0 0 14 20 0.0000 4 240 5115 2100 2700 > (in-package common-lisp-user)
4 0 0 0 0 14 20 0.0000 4 255 5940 2100 3000 #<The COMMON-LISP-USER package, ...>
4 0 0 0 0 14 20 0.0000 4 240 2475 2100 3300 > (export 'bar)
4 0 0 0 0 14 20 0.0000 4 165 165 2100 3600 T
4 0 0 0 0 14 20 0.0000 4 225 2310 2100 3900 > (setf bar 5)
4 0 0 0 0 14 20 0.0000 4 180 165 2100 4200 5
4 0 0 0 0 14 20 0.0000 4 240 3135 2100 4500 > (in-package mine)
4 0 0 0 0 14 20 0.0000 4 255 3960 2100 4800 #<The MINE package, ...>
4 0 0 0 0 14 20 0.0000 4 240 3630 2100 5100 > common-lisp-user:bar
4 0 0 0 0 14 20 0.0000 4 180 165 2100 5400 5
4 0 0 0 0 14 20 0.0000 4 240 5280 2100 5700 > (import 'common-lisp-user:bar)
4 0 0 0 0 14 20 0.0000 4 165 165 2100 6000 T
4 0 0 0 0 14 20 0.0000 4 180 825 2100 6300 > bar
4 0 0 0 0 14 20 0.0000 4 180 165 2100 6600 5
4 0 0 0 0 18 20 0.0000 4 270 6930 1200 7200 Importation de l'ensemble des symboles exportés:
4 0 0 0 0 14 20 0.0000 4 240 5445 2100 7800 > (use-package 'common-lisp-user)
4 0 0 0 0 14 20 0.0000 4 165 165 2100 8100 T
\vfill\end{slide}
%--------------------------------
\begin{slide}\ti{Loop}
4 0 0 0 0 14 20 0.0000 4 225 3300 900 1800 (defun most (fn lst)
4 0 0 0 0 14 20 0.0000 4 225 2640 900 2100   (if (null lst)
4 0 0 0 0 14 20 0.0000 4 225 3630 900 2400       (values nil nil)
4 0 0 0 0 14 20 0.0000 4 225 4785 900 2700       (let* ((wins (car lst))
4 0 0 0 0 14 20 0.0000 4 225 5940 900 3000              (max (funcal fn wins)))
4 0 0 0 0 14 20 0.0000 4 240 5115 900 3300         (dolist (obj (cdr lst))
4 0 0 0 0 14 20 0.0000 4 240 6765 900 3600           (let ((score (funcall fn obj)))
4 0 0 0 0 14 20 0.0000 4 225 5115 900 3900             (when (> score max)
4 0 0 0 0 14 20 0.0000 4 240 4785 900 4200               (setf wins obj)
4 0 0 0 0 14 20 0.0000 4 225 5445 900 4500                     max score))))
4 0 0 0 0 14 20 0.0000 4 225 4620 900 4800         (values wins max))))
4 0 0 0 0 14 20 0.0000 4 225 3300 900 5400 (defun most (fn lst)
4 0 0 0 0 14 20 0.0000 4 225 2640 900 5700   (if (null lst)
4 0 0 0 0 14 20 0.0000 4 225 3630 900 6000       (values nil nil)
4 0 0 0 0 14 20 0.0000 4 240 5445 900 6300       (loop with wins = (car lst)
4 0 0 0 0 14 20 0.0000 4 225 6600 900 6600             with max = (funcall fn wins)
4 0 0 0 0 14 20 0.0000 4 240 5280 900 6900             for obj in (cdr lst)
4 0 0 0 0 14 20 0.0000 4 240 6600 900 7200             for score = (funcall fn obj)
4 0 0 0 0 14 20 0.0000 4 225 4950 900 7500             when (> score max)
4 0 0 0 0 14 20 0.0000 4 240 5115 900 7800               do (setf wins obj
4 0 0 0 0 14 20 0.0000 4 225 5445 900 8100                        max score)
4 0 0 0 0 14 20 0.0000 4 240 8085 900 8400             finally (return (values wins max)))))
\vfill\end{slide}
