Path: uni-berlin.de!individual.net!not-for-mail
From: pjb@informatimago.com (Pascal J. Bourguignon)
Newsgroups: fr.comp.lang.lisp
Subject: Générer le graphe des types Common Lisp
Date: Sat, 16 Oct 2010 04:55:31 +0200
Organization: Informatimago
Lines: 78
Message-ID: <871v7qg82k.fsf@kuiper.lan.informatimago.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: individual.net pGWBVP4erdAPi1iC+hx7SghB+4zKI44AmHmkhpBej9vHeWRU4x
Cancel-Lock: sha1:MmFlYWNhYzNmOWM2ODMxYTJiOWNhNGQ1ZGIwYjEwZDIzNzBmYzE1MQ== sha1:4pOMV8Yhy/1AiBng5epcGMf8NGM=
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA
      oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9
      033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac
      l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR
      mV+hO/VvFAAAAABJRU5ErkJggg==
X-Accept-Language:         fr, es, en
X-Disabled: X-No-Archive: no
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)
Xref: uni-berlin.de fr.comp.lang.lisp:3823


Comme il y a trés peu de trafic sur fcll, j'ai décidé de l'utiliser
comme mon blog personnel.  Voici donc le premier article.
------------------------------------------------------------------------

Générer le graphe des types Common Lisp

Un novice a demandé quels sont les types définis en Common Lisp.  Il y
a quelques temps, j'avais vu un joli graphe des types Common Lisp sur
le Web, mais je n'arrive plus à le retrouver.  Ce n'est pas la
première fois que ça arrive.  J'ai donc décidé de rédiger un petit
programme vite fait bien fait pour construire ces graphes par
introspection de l'implémentation Common Lisp.

Notez que le graphe de la hiérarchie des types dépend de
l'implémentation Common Lisp, car la définition de certains types
standards dépend de l'implémentation (par exemple les sous-types de
FLOAT peuvent être tous les mêmes, ou tous distincts, ou une combinaison
respectant certains critères).

Voici donc le programme cl-types-graph.lisp qui collecte tous les
symboles exportés du paquetage COMMON-LISP, et qui reconstitue leur
relation de sous-type.

http://www.informatimago.com/articles/cl-types/cl-types-graph.lisp

Dans le cas de certaines implémentations comme Clozure ou SBCL, tout
symbole désigne un type, et donc tous les symboles exportés de
COMMON-LISP seraient intégrés au graphe, entre les types NIL et T.  Ils
ne sont pas significatifs, alors nous les enlevons.

Les noms de types équivalents sont placés dans noeud unique étiquetté
par une liste contenant tous les noms de type équivalent.

Enfin, notez que nous ne considérons ici que les types indiqués par un
symbole unique. Le standard Common Lisp définit en fait des familles
de types désignés par des sexps, telles que (vector 42 single-float).

Le graphe ainsi obtenu est généré sous forme de fichier dot de
GraphViz, et les commandes de  GraphViz tred et dot sont utilisées
pour générer l'image.  Par exemple:

    clall '(load "cl-types-graph.lisp")' clall (load "cl-types-graph.lisp") '
    for f in cl-types-in-*.dot ; do for f in cl-types en *. dot, ne
       tred < $f |dot -Tps /dev/stdin > ${f/.dot/.ps} TRED <$ f | dot-Tps / dev stdin /> $ {f / .dot / .ps}
    done fait
    for f in  cl-types-in-*.ps ; do for f in cl-types en *. ps; ne
       gsview $f & gsview $ f &
    done fait

La commande clall se trouve dans: http://tinyurl.com/2urswh9

Finalement, vous pouvez voir les graphes obtenus à partir de CCL,
SBCL, ECL et CLISP, indexés sur:

http://www.informatimago.com/articles/cl-types/

Fichiers GraphViz dot :
http://www.informatimago.com/articles/cl-types/cl-types-in-clisp.dot
http://www.informatimago.com/articles/cl-types/cl-types-in-clozure-common-lisp.dot
http://www.informatimago.com/articles/cl-types/cl-types-in-ecl.dot
http://www.informatimago.com/articles/cl-types/cl-types-in-sbcl.dot

Graphes au format PostScript :
http://www.informatimago.com/articles/cl-types/cl-types-in-clisp.ps
http://www.informatimago.com/articles/cl-types/cl-types-in-clozure-common-lisp.ps
http://www.informatimago.com/articles/cl-types/cl-types-in-ecl.ps
http://www.informatimago.com/articles/cl-types/cl-types-in-sbcl.ps


CLHS:     http://www.lispworks.com/documentation/HyperSpec/Front/index.htm
GraphViz: http://www.graphviz.org/

------------------------------------------------------------------------


--
__Pascal Bourguignon__                     http://www.informatimago.com/
ViewGit