r4518: Auto commit for Debian build
[hyperobject.git] / mop.lisp
index 78712ca0af6a5eb7277958c54f5a2eb87e338d3f..2d42f85026f4b04b06e25806c0cc31f0ac964f53 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.45 2003/04/12 05:30:05 kevin Exp $
+;;;; $Id: mop.lisp,v 1.57 2003/04/16 20:20:27 kevin Exp $
 ;;;;
 ;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg
 ;;;;
@@ -84,7 +84,7 @@
 
 (defclass hyperlink ()
   ((name :type symbol :initform nil :initarg :name :reader name)
-   (lookup :type function :initform nil :initarg :lookup :reader lookup)
+   (lookup :type (or function symbol) :initform nil :initarg :lookup :reader lookup)
    (link-parameters :type list :initform nil :initarg :link-parameters
                    :reader link-parameters)))
 
                                             value)
       (when (and ,required (null value))
        (error "hyperobject class slot ~A must have a value" name))
-      (list name value))
+      (list name `',value))
     #+(or allegro sbcl cmu scl)
     (declare (ignore slot-name required))
     )
                                            value
                                            already-processed-options
                                            slot)
-      (list* option value already-processed-options))
+      (list* option `',value already-processed-options))
     #-lispworks
     (declare (ignore slot-name))
     )
     (t
      t)))
 
-#+(or sbcl cmu scl)
-(defmethod compute-effective-slot-definition :around ((cl hyperobject-class) dsds)
-  (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 dsd 'sql-type) sql-type)
-      (setf (slot-value dsd 'type) (value-type-to-lisp-type value-type))
-      (let ((ia (compute-effective-slot-definition-initargs
-                cl #+lispworks name dsds)))
-       (apply
-        #'make-instance 'hyperobject-esd 
-        :value-type value-type
-        :sql-type sql-type
-        :length length
-        :print-formatter (slot-value dsd 'print-formatter)
-        :subobject (slot-value dsd 'subobject)
-        :hyperlink (slot-value dsd 'hyperlink)
-        :hyperlink-parameters (slot-value dsd 'hyperlink-parameters)
-        :description (slot-value dsd 'description)
-        :user-name (slot-value dsd 'user-name)
-        :index (slot-value dsd 'index)
-        :value-constraint (slot-value dsd 'value-constraint)
-        :null-allowed (slot-value dsd 'null-allowed)
-        ia)))))
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (when (>= (length (generic-function-lambda-list
+                    (ensure-generic-function
+                     'compute-effective-slot-definition)))
+           3)
+    (push :ho-named-cesd-fun cl:*features*)))
 
 (defmethod compute-effective-slot-definition :around ((cl hyperobject-class)
-                                                     #+(or lispworks allegro) name
+                                                     #+ho-named-cesd-fun name
                                                      dsds)
   #+allegro (declare (ignore name))
   (let* ((dsd (car dsds))
         :value-constraint (slot-value dsd 'value-constraint)
         :null-allowed (slot-value dsd 'null-allowed)
         ia)))))
-  
+
+
+#+ho-named-cesd-fun
+(setq cl:*features* (delete :ho-named-cesd-fun cl:*features*))
+
 (defun value-type-to-lisp-type (value-type)
   (case (if (atom value-type)
            value-type
     `(defmethod slot-unbound (,the-class (,the-instance ,class)
                              (,the-slot-name (eql ',slot-name)))
       (declare (ignore ,the-class))
-      (setf (slot-value ,the-instance ,the-slot-name)
-       (,reader ,@keys)))))
+      (let ((v (,reader ,@keys)))
+       (setf (slot-value ,the-instance ,the-slot-name) v)))))
+
 
 #+lispworks
 (defun intern-eql-specializer (slot)
                                                                       nil
                                                                       (cdr subobj-def)))))
                        (unless (eq (lookup subobject) t)
-                         #-(or sbcl cmu lispworks)
+                         #-(or sbcl lispworks)
                          (eval
                           `(hyperobject::def-lazy-reader ,(name-class subobject)
                             ,(name-slot subobject) ,(lookup subobject)
                             ,@(lookup-keys subobject)))
-                         #+(or sbcl cmu lispworks)
+                         #+(or sbcl lispworks)
                          (apply #'ensure-lazy-reader 
                                 (name-class subobject) (name-slot subobject) (lookup subobject) (lookup-keys subobject))
                          )