Code - turtles-own
[clnl] / src / main / nvm / agent.lisp
1 (in-package #:clnl-nvm)
2
3 (defun agent-value (var &optional (agent *self*))
4  "AGENT-VALUE VAR &optional AGENT => RESULT
5
6 ARGUMENTS AND VALUES:
7
8   VAR: A variable name
9   AGENT: an agent, defaulting to *self*
10   RESULT: the value of VAR
11
12 DESCRIPTION:
13
14   AGENT-VALUE is the general agent variable access function.  For many
15   NetLogo reporters, the compilation results is AGENT-VALUE.  The list of
16   valid values are any builtin variable in the NetLogo dictionary, as well
17   as any *-own variable.
18
19   See http://ccl.northwestern.edu/netlogo/docs/dictionary.html for builtins"
20  (agent-value-inner agent (intern (string-upcase var) :keyword)))
21
22 (defsetf agent-value (var &optional (agent '*self*)) (new-value)
23  `(set-agent-value-inner ,agent ,var ,new-value))
24
25 (defgeneric set-agent-value-inner (agent var new-value))
26 (defgeneric agent-value-inner (agent var))
27
28 (defmacro defagent-value (type symb &optional accessor)
29  (let
30   ((accessor (or accessor (intern (format nil "~A-~A" type symb))))
31    (agent (gensym))
32    (var (gensym))
33    (new-val (gensym)))
34   `(progn
35     (defmethod agent-value-inner ((,agent ,type) (,var (eql ,symb))) (,accessor ,agent))
36     (defmethod set-agent-value-inner ((,agent ,type) (,var (eql ,symb)) ,new-val) (setf (,accessor ,agent) ,new-val)))))
37
38 ; Don't want the setter for :who
39 (defmethod agent-value-inner ((turtle turtle) (var (eql :who))) (turtle-who turtle))
40
41 (defagent-value patch :pcolor patch-color)
42
43 (defagent-value turtle :color)
44 (defagent-value turtle :label)
45 (defagent-value turtle :label-color)
46 (defagent-value turtle :size)
47
48 (defmethod agent-value-inner ((turtle turtle) var)
49  (when (not (find var *turtles-own-vars*)) (error "~S is not a turtle variable" var))
50  (or (getf (turtle-own-vars turtle) var) 0d0))
51
52 (defmethod set-agent-value-inner ((turtle turtle) var new-val)
53  (when (not (find var *turtles-own-vars*)) (error "~S is not a turtle variable" var))
54  (if (getf (turtle-own-vars turtle) var)
55   (setf (getf (turtle-own-vars turtle) var) new-val)
56   (setf (turtle-own-vars turtle) (append (list var new-val) (turtle-own-vars turtle)))))