
On Mon, Aug 11, 2008 at 9:56 PM, Pascal Costanza <pc@p-cos.net> wrote:
Maybe I'm missing something...
The ability to derive the type of both CAR and CDR of an INT-LIST (or whatever). That said, (let ((list (get-list))) (declare (type (cons integer list) list)) ...) gives compiler as much information as a recursive type, assuming that the CDR is always assigned back to LIST. Likewise, (defstruct listoid (int 0 :type integer) (tail nil :type (or null listoid))) gives the compiler just as much information (though the representation is almost certain to be 4 words on the heap as opposed to 2 for a CONS. DEFSTRUCT also gives you the ability to define what amount to mutually recursive types: (defstruct one (two nil :type (or null two))) (defstruct two (one nil :type (or null one))) All in all, I would be perhaps more interested in a SIMPLE-LIST type, (where CAR is always of the same type), then recursive DEFTYPE in general: (deftype int-list () '(simple-list integer)) In terms of what implmenentations do, what does Allegro do for (compile nil '(lambda (x) (typep x 'int-list))) and (deftype fixnum-list () '(or null (cons fixnum fixnum-list))) (compile nil '(lambda (x) (declare (fixnum-list x) (optimize speed)) (let ((a (first x)) (b (second x))) (when (and a b) (+ a b)))) ? (That is, does it implement recursive types for the compiler as well, or do they just work in full calls to TYPEP?) Cheers, -- Nikodemus