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)