each time it's used, so changes depending on the state of the engine.
See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#patches"
- *patches*)
+ :patches)
(defun turtles ()
"TURTLES => ALL-TURTLES
each time it's used, so changes depending on the state of the engine.
See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#turtles"
- *turtles*)
+ :turtles)
-(defun ask (agent-set fn)
- "ASK AGENT-SET FN => RESULT
+(defun ask (agent-or-agent-set fn)
+ "ASK AGENT-OR-AGENT-SET FN => RESULT
+
+ AGENT-OR-AGENT-SET: AGENT | AGENT-SET
ARGUMENTS AND VALUES:
- AGENT-SET: a NetLogo agentset
FN: a function, run on each agent
RESULT: undefined, commands don't return
+ AGENT: a NetLogo agent
+ AGENT-SET: a NetLogo agentset
DESCRIPTION:
ASK is equivalent to ask in NetLogo.
- The specified AGENT-SET runs the given FN. The order in which the agents
- are run is random each time, and only agents that are in the set at the
- beginning of the call.
+ The specified AGENT-SET or AGENT runs the given FN. In the case of an
+ AGENT-SET, the order in which the agents are run is random each time,
+ and only agents that are in the set at the beginning of the call.
See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#ask"
- (let
- ((iter (shufflerator (agent-set-list agent-set))))
- (loop
- :for agent := (funcall iter)
- :while agent
- :do (let ((*myself* *self*) (*self* agent)) (funcall fn)))))
+ (cond
+ ((agent-set-p agent-or-agent-set)
+ (let
+ ((iter (shufflerator (agent-set-list agent-or-agent-set))))
+ (loop
+ :for agent := (funcall iter)
+ :while agent
+ :do (let ((*myself* *self*) (*self* agent)) (funcall fn)))))
+ ((agent-p agent-or-agent-set)
+ (let ((*myself* *self*) (*self* agent-or-agent-set)) (funcall fn)))
+ (t
+ (error "Ask requires an agent-set or agent but got: ~A" agent-or-agent-set))))
+
+(defun count (agent-set)
+ "COUNT AGENT-SET => N
+
+ARGUMENTS AND VALUES:
-(defun of (fn agent-set)
- "OF FN AGENT-SET => RESULT
+ AGENT-SET: a NetLogo agentset
+ N: a number
+
+DESCRIPTION:
+
+ COUNT is equivalent to count in NetLogo. Returns N, the number of
+ agents in AGENT-SET.
+
+ See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#count"
+ (coerce (length (agent-set-list agent-set)) 'double-float))
+
+(defun of (fn agent-or-agent-set)
+ "OF FN AGENT-OR-AGENT-SET => RESULT
+
+ AGENT-OR-AGENT-SET: AGENT | AGENT-SET
+ RESULT: RESULT-LIST | RESULT-VALUE
ARGUMENTS AND VALUES:
FN: a function, run on each agent
+ AGENT: a NetLogo agent
AGENT-SET: a NetLogo agentset
- RESULT: a list
+ RESULT-LIST: a list
+ RESULT-VALUE: a single value
DESCRIPTION:
OF is equivalent to of in NetLogo.
- The specified AGENT-SET runs the given FN. The order in which the agents
- are run is random each time, and only agents that are in the set at the
- beginning of the call. A list is returned of the returned valuse of
- FN.
+ The specified AGENT-SET or AGENT runs the given FN. In the case of an
+ AGENT-SET, the order in which the agents are run is random each time,
+ and only agents that are in the set at the beginning of the call.
+
+ RESULT-LIST is returned when the input is an AGENT-SET, but RESULT-VALUE
+ is returned when only passed an AGENT.
See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#of"
- (let
- ((iter (shufflerator (agent-set-list agent-set))))
- (loop
- :for agent := (funcall iter)
- :while agent
- :collect (let ((*myself* *self*) (*self* agent)) (funcall fn)))))
+ (cond
+ ((agent-set-p agent-or-agent-set)
+ (let
+ ((iter (shufflerator (agent-set-list agent-or-agent-set))))
+ (loop
+ :for agent := (funcall iter)
+ :while agent
+ :collect (let ((*myself* *self*) (*self* agent)) (funcall fn)))))
+ ((agent-p agent-or-agent-set)
+ (let ((*myself* *self*) (*self* agent-or-agent-set)) (funcall fn)))
+ (t
+ (error "Of requires an agent-set or agent but got: ~A" agent-or-agent-set))))
(defun shufflerator (agent-set-list)
(let
See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-float"
(clnl-random:next-double n))
+(defun random (n)
+ "RANDOM N => RANDOM-NUMBER
+
+ARGUMENTS AND VALUES:
+
+ N: an integer, the upper bound of the random
+ RANDOM-NUMBER: an integer, the random result
+
+DESCRIPTION:
+
+ Returns a random number strictly closer to zero than N.
+
+ If number is positive, returns a random integer greater than or equal to 0,
+ but strictly less than number.
+
+ If number is negative, returns a random integer less than or equal to 0,
+ but strictly greater than number.
+
+ If number is zero, the result is always 0.
+
+ See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random"
+ (coerce (clnl-random:next-long (truncate n)) 'double-float))
+
+(defun random-xcor ()
+ "RANDOM-XCOR => RANDOM-NUMBER
+
+ARGUMENTS AND VALUES:
+
+ RANDOM-NUMBER: a float, the random result
+
+DESCRIPTION:
+
+ Returns a random floating point number in the allowable range of turtle
+ coordinates along the x axis.
+
+ These range from min-pxcor - 0.5 (inclusive) to max-pxcor + 0.5 (exclusive)
+
+ See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-cor"
+ (let
+ ((min (- (min-pxcor) 0.5d0))
+ (max (+ (max-pxcor) 0.5d0)))
+ (+ min (clnl-random:next-double (- max min)))))
+
+(defun random-ycor ()
+ "RANDOM-YCOR => RANDOM-NUMBER
+
+ARGUMENTS AND VALUES:
+
+ RANDOM-NUMBER: a float, the random result
+
+DESCRIPTION:
+
+ Returns a random floating point number in the allowable range of turtle
+ coordinates along the y axis.
+
+ These range from min-pycor - 0.5 (inclusive) to max-pycor + 0.5 (exclusive)
+
+ See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-cor"
+ (let
+ ((min (- (min-pycor) 0.5d0))
+ (max (+ (max-pycor) 0.5d0)))
+ (+ min (clnl-random:next-double (- max min)))))
+
(defun one-of (agent-set)
"ONE-OF AGENT-SET => RESULT
(if (zerop length) :nobody (nth (clnl-random:next-int length) agent-set-list))))
(defun jump (n)
- (when (not (turtle-p *self*)) (error "Gotta call fd in turtle scope, dude (~A)" *self*))
+ (when (not (turtle-p *self*)) (error "Gotta call jump in turtle scope, dude (~A)" *self*))
(setf
(turtle-xcor *self*)
(wrap-x *topology*
(wrap-y *topology*
(+ (turtle-ycor *self*) (* n (using-cached-cos (turtle-heading *self*)))))))
+(defun setxy (x y)
+ "SETXY X Y => RESULT
+
+ARGUMENTS AND VALUES:
+
+ X: a double
+ Y: a double
+ RESULT: undefined
+
+DESCRIPTION:
+
+ Sets the x-coordinate and y-coordinate for the turle. Equivalent to
+ set xcor x set ycor y, except it happens in one step inside of two.
+
+ See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#setxy"
+ (when (not (turtle-p *self*)) (error "Gotta call setxy in turtle scope, dude (~A)" *self*))
+ (setf (turtle-xcor *self*) (wrap-x *topology* x))
+ (setf (turtle-ycor *self*) (wrap-y *topology* y)))
+
(defun forward (n)
"FORWARD N => RESULT