[Openmcl-devel] deftype list-of (recursive definition)

Pascal J. Bourguignon pjb at informatimago.com
Thu Jul 26 10:56:31 PDT 2012

Taoufik Dachraoui <dachraoui.taoufik at gmail.com> writes:

> Hi
> I would like to define a recursive type as follows:
> (deftype list-of (type)
>    `(or null (cons ,type (list-of ,type))))
> This does not work (stack overflow)
> How can define such types?

cl-user> (deftype list-of (type)
           (let ((funame (gensym (prin1-to-string `(list-of ,type)))))
             (compile funame `(lambda (x)  
                                (declare (ftype (function (t) t) ,funame))
                                (or (null x) 
                                    (and (consp x)
                                         (typep (car x) ',type)
                                         (,funame (cdr x))))))
             `(satisfies ,funame)))

cl-user> (typep '("one" "two" "three") '(list-of string))
cl-user> (typep '("one" 3 "three") '(list-of string))

__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.

More information about the Openmcl-devel mailing list