(sb!kernel::arg-count-error 'deftype (car whole) (cdr whole) nil 0 0)
expansion)))
-(def!macro sb!xc:deftype (name lambda-list &body body)
+(defun %deftype (name)
+ (setf (classoid-cell-pcl-class (find-classoid-cell name :create t)) nil))
+
+(def!macro sb!xc:deftype (&whole form name lambda-list &body body)
#!+sb-doc
"Define a new type, with syntax like DEFMACRO."
(unless (symbolp name)
- (error "type name not a symbol: ~S" name))
+ (bad-type name 'symbol "Type name is not a symbol:~% ~S"
+ form))
(multiple-value-bind (expander-form doc source-location-form)
(multiple-value-bind (forms decls doc) (parse-body body)
;; FIXME: We could use CONSTANTP here to deal with slightly more
;; is not availble early enough.
(if (and (not lambda-list) (not decls) (not (cdr forms))
(or (member (car forms) '(t nil))
- (eq 'quote (caar forms))))
- (values `(constant-type-expander ,@forms) doc '(sb!c:source-location))
+ (and (consp (car forms)) (eq 'quote (caar forms)))))
+ (values `(constant-type-expander ,(car forms)) doc '(sb!c:source-location))
(with-unique-names (whole)
(multiple-value-bind (macro-body local-decs doc)
(parse-defmacro lambda-list whole body name 'deftype :default-default ''*)
,macro-body)
doc
nil)))))
- `(eval-when (:compile-toplevel :load-toplevel :execute)
- (%compiler-deftype ',name
- ',lambda-list
- ,expander-form
- ,doc
- ,source-location-form))))
+ `(progn
+ (eval-when (:compile-toplevel :load-toplevel :execute)
+ (%compiler-deftype ',name
+ ',lambda-list
+ ,expander-form
+ ,doc
+ ,source-location-form))
+ (eval-when (:load-toplevel :execute)
+ (%deftype ',name))
+ ',name)))