Automated commit for debian release 2.13-1
[hyperobject.git] / rules.lisp
index d9ea16e1819f87eb331e3e51e37817e49124ef63..00d64b55e3d8c5baf512bcf935afe69d86eab867 100644 (file)
@@ -7,16 +7,12 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: rules.lisp,v 1.16 2003/04/22 15:43:53 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)))))
 
-(defmethod (setf slot-value-using-class) 
-    :around (new-value (cl hyperobject-class) obj
-                      (slot standard-effective-slot-definition))
-    (call-next-method))
 
-(defmethod (setf slot-value-using-class) 
-    :around (new-value (cl hyperobject-class) obj
-                      (slot standard-effective-slot-definition))
-    #+ignore
-    (cmsg-c :verbose "Setf slot value: class: ~s, obj: ~s, slot: ~s, value: ~s" cl (class-of obj) slot new-value)
+#+ho-svuc
+(defmethod (setf slot-value-using-class) :around
+    (new-value (cl hyperobject-class) obj (slot hyperobject-esd))
 
-    (let ((func (slot-value slot 'value-constraint)))
-      (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-value obj (slot-definition-name slot)))
-       (t
-        (prog1
-            (call-next-method)
-          (when (direct-rules cl)
-            (fire-class-rules cl obj slot)))))))
+  #+ignore
+  (cmsg-c :verbose "Setf slot value: class: ~s, obj: ~s, slot: ~s, value: ~s" cl (class-of obj) slot new-value)
 
-#+ignore
-(defmethod slot-value-using-class :around ((cl hyperobject-class) obj
-                                          (slot standard-effective-slot-definition))
-  (let ((value (call-next-method)))
-    (cmsg-c :verbose "slot value: class: ~s, obj: ~s, slot: ~s" cl (class-of obj) slot)
-    value))
+  (let ((func (esd-value-constraint slot)))
+    (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-value obj (slot-definition-name slot)))
+      (t
+       (prog1
+           (call-next-method)
+         (when (direct-rules cl)
+           (fire-class-rules cl obj slot)))))))