X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;ds=sidebyside;f=hyperobject.lisp;h=a6d1b4944119a80484e7e5da90eb92f0d9b90695;hb=13e3ab1f2045c54401aeebeb5eff49c55649fd27;hp=921f6f8ad7c4fc6bbb051b44bc32ac425e8a2fef;hpb=56d53b357e4771cf5d394188c3ec82aa9b9216c2;p=hyperobject.git diff --git a/hyperobject.lisp b/hyperobject.lisp index 921f6f8..a6d1b49 100644 --- a/hyperobject.lisp +++ b/hyperobject.lisp @@ -11,67 +11,58 @@ ;;;; in Text, HTML, and XML formats. This includes hyperlinking ;;;; capability and sub-objects. ;;;; -;;;; $Id: hyperobject.lisp,v 1.7 2002/11/22 16:05:08 kevin Exp $ +;;;; $Id: hyperobject.lisp,v 1.10 2002/11/23 18:41:45 kevin Exp $ ;;;; ;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg ;;;; ;;;; ************************************************************************* -(in-package :hyperobject-mop) +(in-package :hyperobject) (eval-when (:compile-toplevel :execute) (declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))) -#+allegro (shadowing-import - mop:class-slots mop::slot-definition-name mop:finalize-inheritance - mop::standard-direct-slot-definition mop::standard-effective-slot-definition - mop:direct-slot-definition-class mop:compute-effective-slot-definition - excl::compute-effective-slot-definition-initargs -) - -#+lispworks -(shadowing-import - clos:class-slots clos::slot-definition-name clos:finalize-inheritance - clos::standard-direct-slot-definition clos::standard-effective-slot-definition - clos:direct-slot-definition-class clos:compute-effective-slot-definition - clos::compute-effective-slot-definition-initargs - ) - + #+allegro + `(mop::class-slots mop::slot-definition-name mop:finalize-inheritance + mop::standard-direct-slot-definition mop::standard-effective-slot-definition + mop:direct-slot-definition-class mop:compute-effective-slot-definition + excl::compute-effective-slot-definition-initargs) + #+lispworks + `(clos:class-slots clos::slot-definition-name clos:finalize-inheritance + clos::standard-direct-slot-definition clos::standard-effective-slot-definition + clos:direct-slot-definition-class clos:compute-effective-slot-definition + clos::compute-effective-slot-definition-initargs) + #+sbcl + `(sb-pcl:class-of sb-pcl:class-name sb-pcl:class-slots sb-pcl::standard-class + sb-pcl::slot-definition-name sb-pcl:finalize-inheritance + sb-pcl::standard-direct-slot-definition + sb-pcl::standard-effective-slot-definition sb-pcl::validate-superclass + sb-pcl:direct-slot-definition-class sb-pcl:compute-effective-slot-definition + sb-pcl::compute-effective-slot-definition-initargs) #+(or cmu scl) -(shadowing-import - pcl:class-of pcl:class-name pcl:class-slots pcl::standard-class - pcl::slot-definition-name pcl:finalize-inheritance - pcl::standard-direct-slot-definition pcl::standard-effective-slot-definition - pcl::validate-superclass pcl:direct-slot-definition-class - pcl:compute-effective-slot-definition - pcl::compute-effective-slot-definition-initargs -) - -#+sbcl -(shadowing-import - sb-pcl:class-of sb-pcl:class-name sb-pcl:class-slots sb-pcl::standard-class - sb-pcl::slot-definition-name sb-pcl:finalize-inheritance - sb-pcl::standard-direct-slot-definition - sb-pcl::standard-effective-slot-definition sb-pcl::validate-superclass - sb-pcl:direct-slot-definition-class sb-pcl:compute-effective-slot-definition - sb-pcl::compute-effective-slot-definition-initargs - ) +`(pcl:class-of pcl:class-name pcl:class-slots pcl::standard-class + pcl::slot-definition-name pcl:finalize-inheritance + pcl::standard-direct-slot-definition pcl::standard-effective-slot-definition + pcl::validate-superclass pcl:direct-slot-definition-class + pcl:compute-effective-slot-definition + pcl::compute-effective-slot-definition-initargs) + :hyperobject) ;; Slot definitions (defclass hyperobject-dsd (standard-direct-slot-definition) ((ho-type :initarg :ho-type :initform nil :accessor dsd-ho-type) - (format-func :initarg :format-func :initform nil :accessor dsd-format-func) + (print-formatter :initarg :print-formatter :initform nil :accessor dsd-print-formatter) (subobject :initarg :subobject :initform nil :accessor dsd-subobject) (reference :initarg :reference :initform nil :accessor dsd-reference) )) (defclass hyperobject-esd (standard-effective-slot-definition) ((ho-type :initarg :ho-type :initform nil :accessor esd-ho-type) - (format-func :initarg :format-func :initform nil :accessor esd-format-func) + (print-formatter :initarg :print-formatter :initform nil :accessor esd-print-formatter) (subobject :initarg :subobject :initform nil :accessor esd-subobject) (reference :initarg :reference :initform nil :accessor esd-reference) )) @@ -79,35 +70,34 @@ ;; Main class (defclass hyperobject-class (standard-class) - ((title :initarg :title :type string :reader ml-std-title - :documentation -"Print Title for class") + ((title :initarg :title :type string :initform nil + :documentation "Print Title for class") + (print-slots :initarg :print-slots :type list :initform nil + :documentation "List of slots to print") (subobjects - :initarg :subobjects - :documentation -"List of fields that contain a list of subobjects objects.") + :initarg :subobjects :initform nil + :documentation "List of fields that contain a list of subobjects objects.") (references - :initarg :references :type list :reader ml-std-references + :initarg :references :type list :initform nil :documentation "List of fields that can be referred to by browsers. Format is ((field-name field-lookup-func other-link-params) ...)") ;;; The remainder of these fields are calculated one time ;;; in finalize-inheritence. - (value-func :initform nil :type function :reader ml-std-value-func) - (xmlvalue-func :initform nil :type function :reader ml-std-xmlvalue-func) - (fmtstr-text :initform nil :type string :reader ml-std-fmtstr-text) - (fmtstr-html :initform nil :type string :reader ml-std-fmtstr-html) - (fmtstr-xml :initform nil :type string :reader ml-std-fmtstr-xml) - (fmtstr-text-labels :initform nil :type string :reader ml-std-fmtstr-text-labels) - (fmtstr-html-labels :initform nil :type string :reader ml-std-fmtstr-html-labels) - (fmtstr-xml-labels :initform nil :type string :reader ml-std-fmtstr-xml-labels) - (fmtstr-html-ref :initform nil :type string :reader ml-std-fmtstr-html-ref) - (fmtstr-xml-ref :initform nil :type string :reader ml-std-fmtstr-xml-ref) - (fmtstr-html-ref-labels :initform nil :type string :reader ml-std-fmtstr-html-ref-labels) - (fmtstr-xml-ref-labels :initform nil :type string :reader ml-std-fmtstr-xml-ref-labels) + (value-func :initform nil :type function) + (xmlvalue-func :initform nil :type function) + (fmtstr-text :initform nil :type string) + (fmtstr-html :initform nil :type string) + (fmtstr-xml :initform nil :type string) + (fmtstr-text-labels :initform nil :type string) + (fmtstr-html-labels :initform nil :type string) + (fmtstr-xml-labels :initform nil :type string) + (fmtstr-html-ref :initform nil :type string) + (fmtstr-xml-ref :initform nil :type string) + (fmtstr-html-ref-labels :initform nil :type string) + (fmtstr-xml-ref-labels :initform nil :type string) ) - (:default-initargs :title nil :subobjects nil :references nil) (:documentation "Metaclass for Markup Language classes.")) (defclass subobject () @@ -152,19 +142,27 @@ Format is ((field-name field-lookup-func other-link-params) ...)") (list name (car value)) (list name `',value))) -(defmethod (compute-effective-slot-definition) :around +#+lispworks +(defmethod clos:process-a-class-option ((class hyperobject-class) + (name (eql :print-slots)) + value) + (if (null (cdr value)) + (list name (car value)) + (list name `',value))) + +(defmethod compute-effective-slot-definition :around ((cl hyperobject-class) #+(or allegro lispworks) slot dsds) (declare (ignorable slot)) (let* ((dsd (car dsds)) (ho-type (slot-value dsd 'type))) (setf (slot-value dsd 'ho-type) ho-type) (setf (slot-value dsd 'type) (convert-ho-type ho-type)) - (let ((ia (computer-effective-slot-definition-initargs + (let ((ia (compute-effective-slot-definition-initargs cl #+lispworks slot dsds))) (apply #'make-instance 'hyperobject-esd :ho-type ho-type - :format-func (slot-value dsd 'format-func) + :print-formatter (slot-value dsd 'print-formatter) :subobject (slot-value dsd 'subobject) :reference (slot-value dsd 'reference) ia))) @@ -189,7 +187,10 @@ Format is ((field-name field-lookup-func other-link-params) ...)") ho-type))) ;;;; Class initialization function - + +(defun find-slot-by-name (cl name) + (find name (class-slots cl) :key #'slot-definition-name)) + (defun init-hyperobject-class (cl) (let ((fmtstr-text "") (fmtstr-html "") @@ -209,18 +210,23 @@ Format is ((field-name field-lookup-func other-link-params) ...)") (references nil) (subobjects nil)) (declare (ignore classname)) - (dolist (f (class-slots cl)) - (if (slot-value f 'subobject) - (push (make-instance 'subobject :name (slot-definition-name f) - :reader (if (eq t (esd-subobject f)) - (slot-definition-name f) - (esd-subobject f))) - subobjects) - (let ((name (slot-definition-name f)) - (namestr (symbol-name (slot-definition-name f))) - (namestr-lower (string-downcase (symbol-name (slot-definition-name f)))) - (type (slot-value f 'ho-type)) - (formatter (slot-value f 'format-func)) + (dolist (slot (class-slots cl)) + (when (slot-value slot 'subobject) + (push (make-instance 'subobject :name (slot-definition-name slot) + :reader (if (eq t (esd-subobject slot)) + (slot-definition-name slot) + (esd-subobject slot))) + subobjects))) + (setf (slot-value cl 'subobjects) subobjects) + (dolist (slot-name (slot-value cl 'print-slots)) + (let ((slot (find-slot-by-name cl slot-name))) + (unless slot + (error "Slot ~A is not found in class ~S" slot-name cl)) + (let ((name (slot-definition-name slot)) + (namestr (symbol-name (slot-definition-name slot))) + (namestr-lower (string-downcase (symbol-name (slot-definition-name slot)))) + (type (slot-value slot 'ho-type)) + (print-formatter (slot-value slot 'print-formatter)) (value-fmt "~a") (plain-value-func nil) html-str xml-str html-label-str xml-label-str) @@ -260,13 +266,13 @@ Format is ((field-name field-lookup-func other-link-params) ...)") (string-append fmtstr-html-labels html-label-str) (string-append fmtstr-xml-labels xml-label-str) - (if (esd-reference f) + (if (esd-reference slot) (progn (string-append fmtstr-html-ref "<~~a>" value-fmt "") (string-append fmtstr-xml-ref "<~~a>" value-fmt "") (string-append fmtstr-html-ref-labels "" namestr-lower " <~~a>" value-fmt "") (string-append fmtstr-xml-ref-labels " <~~a>" value-fmt "") - (push (make-instance 'reference :name name :lookup (esd-reference f)) + (push (make-instance 'reference :name name :lookup (esd-reference slot)) references)) (progn (string-append fmtstr-html-ref html-str) @@ -274,9 +280,9 @@ Format is ((field-name field-lookup-func other-link-params) ...)") (string-append fmtstr-html-ref-labels html-label-str) (string-append fmtstr-xml-ref-labels xml-label-str))) - (if formatter + (if print-formatter (setq plain-value-func - (list `(,formatter (,(intern namestr package) x)))) + (list `(,print-formatter (,(intern namestr package) x)))) (setq plain-value-func (list `(,(intern namestr package) x)))) (setq value-func (append value-func plain-value-func)) @@ -287,7 +293,6 @@ Format is ((field-name field-lookup-func other-link-params) ...)") ))) (setf (slot-value cl 'references) references) - (setf (slot-value cl 'subobjects) subobjects) (if value-func (setq value-func `(lambda (x) (values ,@value-func))) @@ -809,7 +814,7 @@ Format is ((field-name field-lookup-func other-link-params) ...)") (print-unreadable-object (obj s :type t :identity t) (let ((fmt (make-instance 'hyperobject::textformat))) (apply #'format - s (funcall (hyperobject-mop::obj-data-fmtstr fmt) obj) + s (funcall (obj-data-fmtstr fmt) obj) (multiple-value-list - (funcall (funcall (hyperobject-mop::obj-data-value-func fmt) obj) obj)))))) + (funcall (funcall (obj-data-value-func fmt) obj) obj))))))