anchor.diff:  	(list reader writer)))
   
   (defun xtype-reader (name) 
  +  (declare (type symbol name))
     (let ((fn (first (gethash name *xtypes*))))
       (if fn
   	fn
   	(error "No type ~S" name))))
   
   (defun xtype-writer (name) 
  +  (declare (type symbol name))
     (let ((fn (second (gethash name *xtypes*))))
       (if fn
   	fn
  
positive.code: 	   (let ((gobj (gensym "OBJ")))
  	     `(let ((,gobj ,obj-form))
  		,@(mapcar (lambda (slot)
  			    (destructuring-bind (slot-name form &rest init) slot 
  			      (declare (ignore init))
  			      (let ((accessor (alexandria:symbolicate struct-type '- slot-name)))
  				(compile-writer form stream-sym `(,accessor ,gobj)))))
  			  slots))))
  	 (compile-union (enum-type arms)
  	   (alexandria:with-gensyms (gtag gval)
  
negative.code: 	   (let ((gobj (gensym "OBJ")))
  	     `(let ((,gobj (,(alexandria:symbolicate 'make- struct-type))))
  		,@(mapcar (lambda (slot)
  			    (unless (symbolp slot)
  			      (destructuring-bind (slot-name form &rest init) slot 
  				(declare (ignore init))
  				(let ((accessor (alexandria:symbolicate struct-type '- slot-name)))
  				  `(setf (,accessor ,gobj) ,(compile-reader form stream-sym))))))
  			  slots)
  		,gobj)))
  	 (compile-union (enum-type arms)
  