[Openmcl-devel] Unknown Type Specifier and structs

Gary Byers gb at clozure.com
Mon Jun 23 18:35:37 PDT 2014


It's hard to say anything useful without knowing when the error occurs.
Did it occur during compilation, after loading a compiled file, or
at some other time ?

>From what I can tell, you're getting the error while trying to make
a POINT structure whose OWNER slot is NIL but is declared to be a
CLUSTER, and this happens in an environment in which the CLUSTER
type isn't yet defined.  What do you think should happen in this
case ?  What do you think after you read section 3.2.3.1.1 of CLHS ?

If I'm guessing correctly about what's happening, then your code
is wrong (or at least non-portable) in a couple of ways:

You can more portably ensure that the type CLUSTER is defined
later in the compilation process by surrounding the CLUSTER definition
with EVAL-WHEN:

(eval-when (:compile-toplevel :load-toplevel :execute)
   (defstruct cluster ...))

This would at least ensure that the type CLUSTER is defined when you
try to try to make a POINT whose OWNER is NIL.  What happens when you
do the latter (violate a type declaration) is undefined; I'm a little
surprised if CCL would check that declaration if (SPEED 3) (SAFETY 1)
is in effect, but I don't know if it indeed was in effect.


On Mon, 23 Jun 2014, Michael Maul wrote:

> Any ideas on the code below causing 'Unknown Type Specifier' condition.
> Works fine on SBCL however CCL throws condition. I think it may relate to
> the :type specification referencing cluster in the point struct definition.
> As if I eval just the cluster struct then reload the module the condition is
> not thown.
> 
> Unknown type specifier: HJS.LEARN.K-MEANS:CLUSTER
> ?? [Condition of type SIMPLE-ERROR]
> 
> 
> Backtrace:
> ? 0: (CCL::%%TYPEP NIL #<UNKNOWN-CTYPE HJS.LEARN.K-MEANS:CLUSTER>)
> ? 1: (TYPEP NIL HJS.LEARN.K-MEANS:CLUSTER NIL)
> 
> 
> ;; Code Fragment
> (declaim (optimize (speed 3) (debug 1) (safety 1)))
> ;;;; data and type definition
> (deftype id () 'fixnum)
> 
> 
> (defstruct (cluster (:conc-name c-)
> ???????????????????
> ??????????????????? (:constructor %make-cluster (id center))
> ???????????????????
> ??????????????????? (:copier copy-cluster))
> ? (id -1 :type id)
> ? (center #.(make-dvec 0) :type dvec)
> ? (old-center #.(make-dvec 0) :type dvec)
> ? (size 0 :type fixnum)
> ? (points nil :type list)
> ? )
> 
> 
> (defun make-cluster (id center)
> ? (let ((center (coerce center 'dvec)))
> ??? (check-type id id)
> ??? (check-type center dvec)
> ??? (let ((result (%make-cluster id (copy-seq center))))
> ????? (setf (c-old-center result) (copy-seq center))
> ????? result)))
> 
> (defstruct (point (:conc-name p-)
> ????????????????? (:constructor %make-point (id pos))
> ????????????????? (:copier copy-point))
> ? (id -1 :type id)
> ? (pos #.(make-dvec 0) :type dvec)
> ? (owner nil :type cluster)?????????????????????????? ;
> ? )
> ...
> 
> 
>



More information about the Openmcl-devel mailing list