;;;;
;;;; A simple example file for hyperobjects
;;;;
-;;;; $Id: person.lisp,v 1.4 2002/12/14 02:30:58 kevin Exp $
+;;;; $Id: person.lisp,v 1.5 2002/12/14 18:51:56 kevin Exp $
;;;;
;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg
;;;;
(:description "A Person")
(:direct-rules
(:rule-1 (:dependants (last-name first-name) :volatile full-name)
- (setf full-name (concatentate 'string first-name " " last-name)))))
+ (setf full-name (concatenate 'string first-name " " last-name)))))
(defun format-date (ut)
(when (typep ut 'integer)
;;;; in Text, HTML, and XML formats. This includes hyperlinking
;;;; capability and sub-objects.
;;;;
-;;;; $Id: mop.lisp,v 1.14 2002/12/14 02:30:58 kevin Exp $
+;;;; $Id: mop.lisp,v 1.15 2002/12/14 18:51:56 kevin Exp $
;;;;
;;;; This file is Copyright (c) 2000-2002 by Kevin M. Rosenberg
;;;;
((name :initarg :name :initform nil :accessor name)
(dependants :initarg :dependants :initform nil :accessor dependants)
(volatile :initarg :volatile :initform nil :accessor volatile)
+ (access-slots :initarg :access-slots :initform nil :accessor access-slots)
(source-code :initarg :source-code :initform nil :accessor source-code)
(func :initform nil :initarg :func :accessor func)))
(defun compile-rule (source-code dependants volatile cl)
- #'(lambda (obj)
- `(with-slots ,(append dependants volatile) obj
- ,@source-code)))
+ (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))))))
+;;)
(defun finalize-rules (cl)
(let* ((direct-rules (direct-rules cl))
(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)))
(defun fire-class-rules (cl obj slot)
"Fire all class rules. Called after a slot is modified."
- (dolist (rule (direct-rules cl))
- (cmsg "firing rule: ~a" rule)))
+ (let ((name (slot-definition-name slot)))
+ (dolist (rule (rules cl))
+ (when (find name (dependants rule))
+ (cmsg "firing rule: ~a" rule)
+ (funcall (func rule) obj)))))
(defmethod (setf slot-value-using-class)
:around (new-value (cl hyperobject-class) obj
(slot-value obj (slot-definition-name slot)))
(t
(call-next-method)
- (fire-class-rules cl obj slot)
+ (when (direct-rules cl)
+ (fire-class-rules cl obj slot))
new-value))))
#+ignore