r4449: Auto commit for Debian build
[hyperobject.git] / mop.lisp
index 48b0f053467972061f868c16da9e31955d5be962..9e6eee67d4f789a82b2a3990c507418ac65a72ae 100644 (file)
--- a/mop.lisp
+++ b/mop.lisp
@@ -11,7 +11,7 @@
 ;;;; in Text, HTML, and XML formats. This includes hyperlinking
 ;;;; capability and sub-objects.
 ;;;;
-;;;; $Id: mop.lisp,v 1.29 2003/03/29 20:29:10 kevin Exp $
+;;;; $Id: mop.lisp,v 1.43 2003/04/12 03:37:52 kevin Exp $
 ;;;;
 ;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg
 ;;;;
 (defmethod compute-effective-slot-definition :around ((cl hyperobject-class)
                                                      #+(or allegro lispworks) name
                                                      dsds)
-  #+allergo (declare (ignore name))
+  #+allegro (declare (ignore name))
   (let* ((dsd (car dsds))
         (value-type (canonicalize-value-type (slot-value dsd 'value-type))))
     (multiple-value-bind (sql-type length) (value-type-to-sql-type value-type)
        (setf (slot-value ,the-instance ,the-slot-name)
           (,reader ,@keys)))))
 
-#+(or sbcl scl cmu)
+#+lispworks
+(defun intern-eql-specializer (slot)
+  `(eql ,slot))
+
+#+(or sbcl cmu lispworks)
 (defun ensure-lazy-reader (class-name slot-name reader &rest reader-keys)
   (let ((keys nil)
        (gf (ensure-generic-function 'slot-unbound)))
       (make-method-lambda
        gf
        (class-prototype (generic-function-method-class gf))
+       #-lispworks
        `(lambda (the-class the-instance the-slot-name)
         (declare (ignore the-class))
         (setf (slot-value the-instance the-slot-name) (,reader ,@keys)))
+       #+lispworks
+       '(the-class the-instance the-slot-name)
+       #+lispworks
+       nil
+       #+lispworks
+       `(setf (slot-value the-instance the-slot-name) (,reader ,@keys))
        nil)
        (add-method gf
                    (apply
                     #'make-instance (generic-function-method-class gf)
-                    ':specializers (list (intern-eql-specializer class-name)
+                    ':specializers (list (class-of (find-class class-name))
                                          (find-class class-name)
                                          (intern-eql-specializer slot-name))
                     ':lambda-list '(the-class the-instance the-slot-name)
-                    ':function `(function ,method-lambda)
+                    ':function (compile nil method-lambda)
                     init-args-values)))))
 
 (defun finalize-subobjects (cl)
                                                           nil
                                                           (cdr subobj-def)))))
            (unless (eq (lookup subobject) t)
-             #-(or sbcl cmu scl)
+             #-(or sbcl cmu lispworks)
              (eval
               `(hyperobject::def-lazy-reader ,(name-class subobject)
                 ,(name-slot subobject) ,(lookup subobject)
                 ,@(lookup-keys subobject)))
-             #+(or sbcl cmu scl)
+             #+(or sbcl cmu lispworks)
              (apply #'ensure-lazy-reader 
                     (name-class subobject) (name-slot subobject) (lookup subobject) (lookup-keys subobject))
              )
            (push subobject subobjects))))
-      subobjects)))
+      ;; sbcl/cmu reverse class-slots compared to the defclass form
+      ;; subobject is already reversed from the dolist/push loop, so re-reverse on cmu/sbcl
+      #+(or cmu sbcl) subobjects
+      #-(or cmu sbcl) (nreverse subobjects)
+    )))
 
 (defun finalize-documentation (cl)
   "Calculate class documentation slot"
                        :lookup it
                        :link-parameters (slot-value esd 'hyperlink-parameters))
         hyperlinks)))
+    ;; cmu/sbcl reverse class-slots compared to the defclass form
+    ;; hyperlinks is already reversed from the dolist/push loop, so re-reverse on sbcl/cmu
+    #-(or cmu sbcl) (setq hyperlinks (nreverse hyperlinks))
     (setf (slot-value cl 'hyperlinks) hyperlinks)))
 
 (defun init-hyperobject-class (cl)
 (defun hyperobject-class-hyperlinks (obj)
   (hyperlinks (class-of obj)))
 
-(defun hyperobject-class-fields (obj)
-  (class-slots (class-of obj)))
+(defun hyperobject-class-slots (obj)
+  ;; cmucl/sbcl reverse class-slots
+  #+(or cmu sbcl) (reverse (class-slots (class-of obj)))
+  #-(or cmu sbcl) (class-slots (class-of obj)))