From: jsancho Date: Thu, 23 Jun 2011 19:24:04 +0000 (+0000) Subject: (no commit message) X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=b30f9aab67a8ae786aabcc586d1aa65a06bb8bbc;p=gacela.git --- diff --git a/src/gacela_mobs.scm b/src/gacela_mobs.scm index c0507f5..51ce549 100755 --- a/src/gacela_mobs.scm +++ b/src/gacela_mobs.scm @@ -54,31 +54,41 @@ ;;; Actions and looks for mobs -(defmacro make-behaviour (name attr &rest code) - `(defun ,(get-behaviour-fun-name name) (object-attr) - (let ,(mapcar #'attribute-definition attr) - ,@code - ,(cons 'progn (mapcar #'attribute-save (reverse attr))) - object-attr))) - -(defun get-behaviour-fun-name (name) - (intern (concatenate 'string "BEHAVIOUR-" (string-upcase (string name))) 'gacela)) - -(defun attribute-name (attribute) - (intern (string attribute) 'keyword)) - -(define (attribute-definition attribute) - (let* ((name (cond ((list? attribute) (car attribute)) - (else attribute))) - (pname (attribute-name name)) - (value (cond ((listp attribute) (cadr attribute))))) - `(,name (getf object-attr ,pname ,value)))) - -(defun attribute-save (attribute) - (let* ((name (cond ((listp attribute) (car attribute)) - (t attribute))) - (pname (attribute-name name))) - `(setf (getf object-attr ,pname) ,name))) +(define (get-attr list name default) + (let ((value (assoc-ref list name))) + (cond (value (car value)) + (else default)))) + +(define (attr-def attr) + (let ((name (car attr)) + (value (cadr attr))) + `(,name (get-attr attributes ',name ,value)))) + +;; (defmacro make-behaviour (name attr &rest code) +;; `(defun ,(get-behaviour-fun-name name) (object-attr) +;; (let ,(mapcar #'attribute-definition attr) +;; ,@code +;; ,(cons 'progn (mapcar #'attribute-save (reverse attr))) +;; object-attr))) + +;; (defun get-behaviour-fun-name (name) +;; (intern (concatenate 'string "BEHAVIOUR-" (string-upcase (string name))) 'gacela)) + +;; (defun attribute-name (attribute) +;; (intern (string attribute) 'keyword)) + +;; (define (attribute-definition attribute) +;; (let* ((name (cond ((list? attribute) (car attribute)) +;; (else attribute))) +;; (pname (attribute-name name)) +;; (value (cond ((listp attribute) (cadr attribute))))) +;; `(,name (getf object-attr ,pname ,value)))) + +;; (defun attribute-save (attribute) +;; (let* ((name (cond ((listp attribute) (car attribute)) +;; (t attribute))) +;; (pname (attribute-name name))) +;; `(setf (getf object-attr ,pname) ,name))) (define-macro (lambda-look . look) (define (process-look look)