I have some rather complex alien types.  For instance, 

(ALIEN:ALIEN
 (*
  (ALIEN:STRUCT RCLG::SEXPREC
   (RCLG::SXPINFO
    (ALIEN:STRUCT RCLG::SXPINFO-STRUCT (RCLG::DATA (ALIEN:UNSIGNED 32))))
   (RCLG::ATTRIB (* (ALIEN:STRUCT RCLG::SEXPREC)))
   (RCLG::GENGCG-NEXT-NODE (* (ALIEN:STRUCT RCLG::SEXPREC)))
   (RCLG::GENGCG-PREV-NODE (* (ALIEN:STRUCT RCLG::SEXPREC)))
   (RCLG::U
    (UNION RCLG::SEXPREC-INTERNAL-UNION
           (RCLG::PRIMSXP
            (ALIEN:STRUCT RCLG::PRIMSXP-STRUCT
             (RCLG::OFFSET (ALIEN:SIGNED 32))))
           (RCLG::SYMSXP
            (ALIEN:STRUCT RCLG::SYMSXP-STRUCT (RCLG::PNAME (* T))
             (RCLG::VALUE (* T)) (RCLG::INTERNAL (* T))))
           (RCLG::LISTSXP
            (ALIEN:STRUCT RCLG::LISTSXP-STRUCT (RCLG::CARVAL (* T))
             (RCLG::CDRVAL (* T)) (RCLG::TAGVAL (* T))))
           (RCLG::ENVSXP
            (ALIEN:STRUCT RCLG::ENVSXP-STRUCT (RCLG::FRAME (* T))
             (RCLG::ENCLOS (* T)) (RCLG::HASHTAB (* T))))
           (RCLG::CLOSXP
            (ALIEN:STRUCT RCLG::CLOSXP-STRUCT (RCLG::FORMALS (* T))
             (RCLG::BODY (* T)) (RCLG::ENV (* T))))
           (RCLG::PROMSXP
            (ALIEN:STRUCT RCLG::PROMSXP-STRUCT (RCLG::VALUE (* T))
             (RCLG::EXPR (* T)) (RCLG::ENV (* T)))))))))

I would like to define a print-object method on this type, to avoid
seeing this 20 line definition repeated everytime something returns me
an object of this type.  Is there any way to do this?  All my attempts
so far (basically along the lines of an eval-when :load-toplevel that
makes an object of the type, calls type-of on it, and then tries to do
a defmethod on this type) have failed.  Any help is appreciated.

rif

ps.  Actually, since my code is built on top of UFFI, what I'd
*really* love is some implementation-portable way to do this, but I'll
settle for something that's CMUCL only if that's all there is.


Reply via email to