Prims - Implement rt, lt
[clnl] / src / main / nvm / nvm.lisp
index 287513e445265ab4a683bf56e14b592be520547a..c5f0865e73bd5c57669dc29ed234eeb976d81134 100644 (file)
@@ -31,6 +31,29 @@ DESCRIPTION:
      :ycor 0d0))))
  (incf *current-id*))
 
+(defun die ()
+ "DIE => RESULT
+
+ARGUMENTS AND VALUES:
+
+  RESULT: undefined, commands don't return
+
+DESCRIPTION:
+
+  The turtle or link dies
+
+  A dead agent ceases to exist. The effects of this include:
+  - The agent will not execute any further code.
+  - The agent will disappear from any agentsets it was in, reducing the size of those agentsets by one.
+  - Any variable that was storing the agent will now instead have nobody in it.
+  - If the dead agent was a turtle, every link connected to it also dies.
+  - If the observer was watching or following the agent, the observer's perspective resets.
+
+  See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#die"
+ (when (not (turtle-p *self*)) (error "Gotta call die in turtle scope, dude (~A)" *self*))
+ (setf (turtle-who *self*) -1)
+ (setf *turtles* (remove *self* *turtles*)))
+
 (defun turtles ()
  "TURTLES => ALL-TURTLES
 
@@ -120,11 +143,11 @@ DESCRIPTION:
  (setf
   (turtle-xcor *self*)
   (wrap-x *topology*
-   (+ (turtle-xcor *self*) (* n (strictmath:sin (strictmath:to-radians (turtle-heading *self*)))))))
+   (+ (turtle-xcor *self*) (* n (using-cached-sin (turtle-heading *self*))))))
  (setf
   (turtle-ycor *self*)
   (wrap-y *topology*
-   (+ (turtle-ycor *self*) (* n (strictmath:cos (strictmath:to-radians (turtle-heading *self*))))))))
+   (+ (turtle-ycor *self*) (* n (using-cached-cos (turtle-heading *self*)))))))
 
 (defun forward (n)
  "FORWARD N => RESULT
@@ -154,6 +177,43 @@ DESCRIPTION:
      (t (jump (if (> i 0d0) 1d0 -1d0)) (internal (- i (if (> i 0d0) 1d0 -1d0)))))))
   (internal n)))
 
+(defun turn-right (n)
+ "TURN-RIGHT N => RESULT
+
+ARGUMENTS AND VALUES:
+
+  N: a double, the amount the turtle turns
+  RESULT: undefined
+
+DESCRIPTION:
+
+  The turtle turns right by number degrees. (If number is negative, it turns left.)
+
+  See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#right"
+ (when (not (turtle-p *self*)) (error "Gotta call fd in turtle scope, dude (~A)" *self*))
+ (let
+  ((new-heading (+ (turtle-heading *self*) n)))
+  (setf (turtle-heading *self*)
+   (cond
+    ((< new-heading 0) (+ (mod new-heading -360) 360))
+    ((>= new-heading 360) (mod new-heading 360))
+    (t new-heading)))))
+
+(defun turn-left (n)
+ "TURN-LEFT N => RESULT
+
+ARGUMENTS AND VALUES:
+
+  N: a double, the amount the turtle turns
+  RESULT: undefined
+
+DESCRIPTION:
+
+  The turtle turns left by number degrees. (If number is negative, it turns right.)
+
+  See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#right"
+ (turn-right (- n)))
+
 (defun create-turtles (n)
  "CREATE-TURTLES N => RESULT
 
@@ -210,6 +270,9 @@ DESCRIPTION:
 
 (defmethod dump-object ((o string)) o)
 
+(defmethod dump-object ((o (eql t))) "true")
+(defmethod dump-object ((o (eql nil))) "false")
+
 (defun current-state ()
  "CURRENT-STATE => WORLD-STATE