www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

notes.txt (3797B)


      1 Types
      2 =====
      3 CLTL 2 et 2.15
      4 Les types LISP sont organisés avec un héritage multiple.
      5 Les objets ont des types, pas les variables.
      6 
      7 Voici la hiérarchie des types (CLTL 2.15) :
      8 
      9 le type t (type, pas symbole) est le super-type (comme Object en Java).
     10 Tous lesobjets sont de type t.
     11 
     12 le type nil (type, pas symbole) est le super-sous-type.
     13 Aucun objet n'est de type nil.
     14 Donc c'est un sous-type de tous les autres types.
     15 
     16 Les types suivants sont disjoints (un objet ne peut pas être dans 2 de ces types à la fois) :
     17 cons symbol array number character hash-table readtable package pathname stream random-state
     18 
     19 De plus, un type créé par defstruct ou defclass est disjoint de chacun des types ci-dessus.
     20 
     21 function est disjoint de cons symbol array number character.
     22 Par contre function n'est pas disjoint de list :
     23  ;; Intersection non nulle
     24  (functionp '(lambda (x) x)) => t
     25  (listp '(lambda (x) x)) => t
     26  ;; function pas inclus dans list
     27  (functionp #'car) => t
     28  (listp #'car) => nil
     29  ;; list pas inclus dans function
     30  (functionp '(1 2 3)) => nil
     31  (listp '(1 2 3)) => t
     32 
     33 Hiérarchie des nombres :
     34              Number
     35                |
     36 Complex -------|--------  Real
     37                            |
     38              float --------|-------rational
     39                |                       |
     40                |           ratio ------|------ integer
     41                |                                  |
     42                |                      fixnum -----|----- bignum
     43                |
     44     |-------------|-------------|-----------|
     45  short-float  single-float  double-float  long-float
     46 
     47 A chaque niveau, les deux types sont disjoints (complex et real, float et rational, ...).
     48 Exception : les différents sous-types de float ont des relations d'inclusion bizarres (voir CLTL).
     49 De plus, fixnum et bignum forment une partition de integer (il n'y a pas d'autre sous-type à par nil).
     50 
     51 null est le type contenant uniquement le symbole nil. C'est un sous-type de symbol.
     52 null et cons forment une partition de list : (listp l) === (xor (consp l) (nullp l))
     53 
     54 etc... (voir cltl et implementation/types.lisp).
     55 
     56 Pour connaître le type de chaque objet, on utilise les n premiers bits,
     57 plus les relations d'inclusion (voir implementation/types.lisp).
     58 Par ex (tous les mots font 32 bits) :
     59 
     60 1ers bits   Passage par pointeur / valeur     Description
     61 ===============================================================
     62 0...        P cons (les 31 bits restants sont l'adresse du car, puis 32 bits pour l'adresse du cdr).
     63               Si tout est à 0 (64 bits tous à zéro), c'est nil
     64 100...      V fixnum (29 bits)
     65 10100...    V caractères unicode sur 8 bits   ;; TODO : y a-t-il des caractères unicode dans le standard ?
     66 10101...    V caractères unicode sur 16 bit
     67 110...      P symbol
     68 111...        Tout le reste :
     69 11100000... P   array
     70 11100001... P   complex
     71 11100010... P   bignum
     72 11100011... P   ratio
     73 111001xx... ?   floats (xx : 00 = short, 01 = single, 10 = double, 11 = long)
     74 11101000... P   hash-table
     75 11101001... P   readtable
     76 11101010... P   package
     77 11101011... P   pathname
     78 11101100... P   stream
     79 11101101... P   random-state
     80 11101110... P   function (attention: d'autes objets peuvent être des fonctions)
     81 
     82 Comme il n'y a très peu de valeurs qui pourraient être passées par valeur, je suggère qu'on passe tout par pointeur.
     83 
     84 Les symboles
     85 ============
     86 CLTL 2
     87 Un symbole, (par ex 'foo), est un "objet" (commençant par 110 dans l'exemple ci-dessus).
     88 Lorsqu'on écrit 'foo, c'est remplacé par un pointeur sur cet objet.
     89 Les symboles ont une liste de propriétés (qu'on implémentera par une alist)
     90 Les symboles ont un nom (qu'on implémentera par une chaîne de caractères).
     91 Le symbole contiendra donc deux pointeurs vers son nom et sa liste de propriétés.
     92 Le symbole nil existe toujours (et a l'adresse 0)