Automated commit for debian release 2.13-1
[hyperobject.git] / rules.lisp
index b42d3615cf503ee32f48f767548ff750c7b1baae..00d64b55e3d8c5baf512bcf935afe69d86eab867 100644 (file)
@@ -7,16 +7,12 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: rules.lisp,v 1.27 2003/04/23 20:11:22 kevin Exp $
-;;;;
-;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg
+;;;; $Id$
 ;;;;
+;;;; This file is Copyright (c) 2000-2003 by Kevin M. Rosenberg
 ;;;; *************************************************************************
-(in-package :hyperobject)
 
-(eval-when (:compile-toplevel :execute)
-  (declaim (optimize (speed 2) (safety 2) (compilation-speed 0) (debug 2))))
+(in-package #:hyperobject)
 
 ;;; Slot accessor and class rules
 
    (func :initform nil :initarg :func :accessor func)))
 
 (defun compile-rule (source-code dependants volatile cl)
+  (declare (ignore cl))
   (let ((access (appendnew dependants volatile)))
     (compile nil
-            (eval
-             `(lambda (obj)
-                (when (every #'(lambda (x) (slot-boundp obj x))
-                             (quote ,dependants))
-                  (with-slots ,access obj
-                    ,@source-code)))))))
-  
+             (eval
+              `(lambda (obj)
+                 (when (every #'(lambda (x) (slot-boundp obj x))
+                              (quote ,dependants))
+                   (with-slots ,access obj
+                     ,@source-code)))))))
+
 (defun finalize-rules (cl)
-  (let* ((direct-rules (direct-rules cl))
-        (rules '()))
-    (dolist (rule direct-rules)
-      (destructuring-bind (name (&key dependants volatile) &rest source-code)
-         rule
-       (setf dependants (mklist dependants)
-             volatile (mklist volatile))
-       (push
-        (make-instance 'rule :name name :dependants dependants
-                       :volatile volatile :source-code source-code
-                       :access-slots (appendnew dependants volatile)
-                       :func (compile-rule
-                              source-code dependants volatile cl))
-        rules)))
-    (setf (rules cl) (nreverse rules))))
+  (setf (rules cl)
+    (loop for rule in (direct-rules cl)
+        collect
+          (destructuring-bind (name (&key dependants volatile) &rest source-code)
+              rule
+            (setf dependants (mklist dependants)
+                  volatile (mklist volatile))
+            (make-instance 'rule :name name :dependants dependants
+                           :volatile volatile :source-code source-code
+                           :access-slots (appendnew dependants volatile)
+                           :func (compile-rule
+                                  source-code dependants volatile cl))))))
 
 
 (defun fire-class-rules (cl obj slot)
   (let ((name (slot-definition-name slot)))
     (dolist (rule (rules cl))
       (when (find name (dependants rule))
-       (cmsg-c :debug "firing rule: ~W" (source-code rule))
-       (funcall (func rule) obj)))))
+        (cmsg-c :debug "firing rule: ~W" (source-code rule))
+        (funcall (func rule) obj)))))
 
 
+#+ho-svuc
 (defmethod (setf slot-value-using-class) :around
     (new-value (cl hyperobject-class) obj (slot hyperobject-esd))
-  ;; this does not work on gerd-pcl in cmu 18e+
-  (esd-value-constraint slot)
-  (call-next-method))
-
-#+ignore
-(defmethod (setf slot-value-using-class) :around 
-    (new-value (cl hyperobject-class) obj (slot hyperobject-esd))
 
   #+ignore
   (cmsg-c :verbose "Setf slot value: class: ~s, obj: ~s, slot: ~s, value: ~s" cl (class-of obj) slot new-value)
-  
+
   (let ((func (esd-value-constraint slot)))
-    (call-next-method)
     (cond
       ((and func (not (funcall func new-value)))
        (warn "Rejected change to value of slot ~a of object ~a"
-            (slot-definition-name slot) obj)
+             (slot-definition-name slot) obj)
        (slot-value obj (slot-definition-name slot)))
       (t
        (prog1
-          (call-next-method)
-        (when (direct-rules cl)
-          (fire-class-rules cl obj slot)))))))
-
-
-
-#+ignore
-(defmethod (setf slot-value-using-class) :around
-    (new-value (cl hyperobject-class) obj (slot hyperobject-esd))
-  (let ((value (call-next-method)))
-    (cmsg-c :verbose "slot value: class: ~s, obj: ~s, slot: ~s" cl (class-of obj) slot)
-    value))
+           (call-next-method)
+         (when (direct-rules cl)
+           (fire-class-rules cl obj slot)))))))