X-Git-Url: https://code.consxy.com/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fmain%2Fnvm%2Fnvm.lisp;h=f59e18138a0bd1d1d0b874f7284ab058c85a8c21;hb=c11c429d212f7a08391cc117b9facd938cd80e63;hp=f2057bd7605540eb65e94917d580dbadd8e91377;hpb=9413d3737ae1c07d7ec2cad29ef3a6d50ab859a9;p=clnl diff --git a/src/main/nvm/nvm.lisp b/src/main/nvm/nvm.lisp index f2057bd..f59e181 100644 --- a/src/main/nvm/nvm.lisp +++ b/src/main/nvm/nvm.lisp @@ -55,7 +55,7 @@ DESCRIPTION: *turtles* (list (make-turtle - :who *current-id* + :who (coerce *current-id* 'double-float) :color (coerce (+ 5 (* 10 (clnl-random:next-int 14))) 'double-float) :heading (coerce (clnl-random:next-int 360) 'double-float) :xcor 0d0 @@ -85,6 +85,23 @@ DESCRIPTION: (setf (turtle-who *self*) -1) (setf *turtles* (remove *self* *turtles*))) +(defun patches () + "PATCHES => ALL-PATCHES + +ARGUMENTS AND VALUES: + + ALL-PATCHES: a NetLogo agentset, all patches + +DESCRIPTION: + + Reports the agentset consisting of all the patches. + + This agentset is special in that it represents the living patches + 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*) + (defun turtles () "TURTLES => ALL-TURTLES @@ -121,15 +138,41 @@ DESCRIPTION: See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#ask" (let - ((iter (shufflerator agent-set))) + ((iter (shufflerator (agent-set-list agent-set)))) (loop :for agent := (funcall iter) :while agent :do (let ((*myself* *self*) (*self* agent)) (funcall fn))))) -(defun shufflerator (agent-set) +(defun of (fn agent-set) + "OF FN AGENT-SET => RESULT + +ARGUMENTS AND VALUES: + + FN: a function, run on each agent + AGENT-SET: a NetLogo agentset + RESULT: a list + +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. + + 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))))) + +(defun shufflerator (agent-set-list) (let - ((copy (copy-list agent-set)) + ((copy (copy-list agent-set-list)) (i 0) (agent nil)) (flet @@ -169,6 +212,26 @@ DESCRIPTION: See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-float" (clnl-random:next-double n)) +(defun one-of (agent-set) + "ONE-OF AGENT-SET => RESULT + + RESULT: RANDOM-AGENT | :nobody + +ARGUMENTS AND VALUES: + + AGENT-SET: An agent set + RANDOM-AGENT: an agent if AGENT-SET is non empty + +DESCRIPTION: + + From an agentset, returns a random agent. If the agentset is empty, returns nobody. + + See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#one-of" + (let* + ((agent-set-list (agent-set-list agent-set)) + (length (length agent-set-list))) + (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*)) (setf @@ -363,6 +426,14 @@ DESCRIPTION: (defmethod dump-object ((o (eql t))) "true") (defmethod dump-object ((o (eql nil))) "false") +(defmethod dump-object ((o list)) (format nil "[~{~A~^ ~}]" (mapcar #'dump-object o))) + +(defmethod dump-object ((o patch)) + (format nil "(patch ~A ~A)" (dump-object (patch-xcor o)) (dump-object (patch-ycor o)))) + +(defmethod dump-object ((o turtle)) (format nil "(turtle ~A)" (dump-object (turtle-who o)))) +(defmethod dump-object ((o (eql :nobody))) (format nil "nobody")) + (defun current-state () "CURRENT-STATE => WORLD-STATE @@ -410,7 +481,7 @@ DESCRIPTION: (lambda (turtle) (format nil "\"~A\",\"~A\",\"~A\",\"~A\",\"~A\",~A" - (turtle-who turtle) + (dump-object (turtle-who turtle)) (dump-object (turtle-color turtle)) (dump-object (turtle-heading turtle)) (dump-object (turtle-xcor turtle))