r4446: Auto commit for Debian build
[hyperobject.git] / mop.lisp
index 613031565164a14fbadedc754242473ae0cc6ebf..6a942da77ffbc35ad305c82f274d8a9aacdf4ac6 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.28 2003/03/29 20:22:37 kevin Exp $
+;;;; $Id: mop.lisp,v 1.41 2003/04/12 03:14:29 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)
-(defun ensure-lazy-reader (class slot-name reader &rest reader-keys)
+#+lispworks
+(defun intern-eql-specializer (slot)
+  `(eql ,slot))
+
+#+(or sbcl scl cmu lispworks)
+(defun ensure-lazy-reader (class-name slot-name reader &rest reader-keys)
   (let ((keys nil)
        (gf (ensure-generic-function 'slot-unbound)))
     (dolist (key reader-keys)
       (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 t class (intern-eql-specializer slot-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 scl lispworks)
              (eval
               `(hyperobject::def-lazy-reader ,(name-class subobject)
                 ,(name-slot subobject) ,(lookup subobject)
                 ,@(lookup-keys subobject)))
-             #+(or sbcl cmu scl)
+             #+(or sbcl cmu scl lispworks)
              (apply #'ensure-lazy-reader 
                     (name-class subobject) (name-slot subobject) (lookup subobject) (lookup-keys subobject))
              )
            (push subobject subobjects))))
-      subobjects)))
+      ;; allegro and lispworks reverse class-slots compared to the defclass form
+      ;; subobject is already reversed from the dolist/push loop, so re-reverse on non-allegro/lispworks
+      #+(or lispworks allegro) subobjects
+      #-(or lispworks allegro) (nreverse subobjects)
+    )))
 
 (defun finalize-documentation (cl)
   "Calculate class documentation slot"
                        :lookup it
                        :link-parameters (slot-value esd 'hyperlink-parameters))
         hyperlinks)))
+    ;; allegro and lispworks reverse class-slots compared to the defclass form
+    ;; hyperlinks is already reversed from the dolist/push loop, so re-reverse on non-allegro/lispworks
+    #-(or lispworks allegro) (setq hyperlinks (nreverse hyperlinks))
     (setf (slot-value cl 'hyperlinks) hyperlinks)))
 
 (defun init-hyperobject-class (cl)
   (hyperlinks (class-of obj)))
 
 (defun hyperobject-class-fields (obj)
-  (class-slots (class-of obj)))
+  ;; allegro and lispworks reverse class-slots
+  #+(or allegro lispworks) (reverse (class-slots (class-of obj)))
+  #-(or allegro lispworks) (class-slots (class-of obj)))