Make agentsets annotated lists, Implement count
authorFrank Duncan <frank@kank.net>
Sat, 30 Apr 2016 17:01:33 +0000 (12:01 -0500)
committerFrank Duncan <frank@kank.net>
Sat, 30 Apr 2016 17:01:33 +0000 (12:01 -0500)
src/main/nvm/base.lisp
src/main/nvm/nvm.lisp
src/main/package.lisp
src/main/parse.lisp
src/main/transpile.lisp
src/test/simpletests.lisp

index 9c49c9900bbd35d308e837fbeabc47dbb8a44193..1df5022fbc08c73d4adb3d5131cc356566dc9c0c 100644 (file)
@@ -14,4 +14,8 @@
 (defstruct patch color xcor ycor)
 
 (defun agent-set-list (agent-set)
- agent-set)
+ (cond
+  ((eql agent-set :turtles) *turtles*)
+  ((eql agent-set :patches) *patches*)
+  ((and (listp agent-set) (eql :agent-set (car agent-set))) (cdr agent-set))
+  (t (error "Doesn't seem to be an agent-set: ~A" agent-set))))
index f8fdd84bde3a72ecdc4c8e87f6db905e5c42ca44..da42870c86d3cbc4129a4220a039c316bd60f75b 100644 (file)
@@ -100,7 +100,7 @@ DESCRIPTION:
   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
@@ -117,7 +117,7 @@ DESCRIPTION:
   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
@@ -144,6 +144,22 @@ DESCRIPTION:
    :while agent
    :do (let ((*myself* *self*) (*self* agent)) (funcall fn)))))
 
+(defun count (agent-set)
+ "COUNT AGENT-SET => N
+
+ARGUMENTS AND VALUES:
+
+  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-set)
  "OF FN AGENT-SET => RESULT
 
index 356a408179b4f2a417c0becba1208b8db1e409ff..d9d95af89b10a14c3259a78d1af9c0a724c9ca58 100644 (file)
@@ -64,11 +64,12 @@ into an ast that can be transpiled later."))
 
 (defpackage #:clnl-nvm
  (:use :common-lisp)
- (:shadow #:random)
+ (:shadow #:random #:count)
  (:export #:export-world #:create-world #:current-state
   ; API as used by transpiled NetLogo programs
   #:agent-value
   #:ask
+  #:count
   #:create-turtles
   #:die
   #:of
index 2f6b77f2a6a859215e44ebeb9d655838f092a2d1..b3dd3d79c919eedd3b169eb5bdd1fb2b7988fb1d 100644 (file)
@@ -224,7 +224,7 @@ DESCRIPTION:
 (defprim :clear-all ())
 (defprim :crt (:number))
 (defprim :color ())
-(defprim :count ())
+(defprim :count (:agentset))
 (defprim :die ())
 (defprim :display ())
 (defprim :with (:reporter-block))
index ea53bfcc7a4c984d08139f977f3082b42f4f1927..627a6a8907cc3cb4855d2e843268f4ce67e1c8ec 100644 (file)
@@ -138,9 +138,10 @@ DESCRIPTION:
 (defsimpleprim :+ :reporter cl:+)
 (defsimpleprim :* :reporter cl:*)
 (defsimpleprim :/ :reporter cl:/)
-(defprim :any? :reporter (lambda (agentset) `(> (length ,agentset) 0)))
+(defprim :any? :reporter (lambda (agentset) `(> (clnl-nvm:count ,agentset) 0)))
 (defsimpleprim :ask :command clnl-nvm:ask)
 (defagentvalueprim :color)
+(defsimpleprim :count :reporter clnl-nvm:count)
 (defsimpleprim :crt :command clnl-nvm:create-turtles)
 (defsimpleprim :die :command clnl-nvm:die)
 (defsimpleprim :fd :command clnl-nvm:forward)
index 43bed4601954c71f079be82585de54bf63dbaf44..22b2d196ee8c8c160446cc4a17c642768657b626 100644 (file)
 
 (defsimplecommandtest "setxy 1" "crt 10 ask turtles [ setxy random-xcor random-ycor ]"
  "B02FD5B864A129AED5254A68C499607F7F6EA236")
+
+(defsimplereportertest "count 1" "count turtles" "0"
+ "E1DE30F072D785E0D0B59F28B0F7853E3D3E0D8B")
+
+(defreportertestwithsetup "count 2" "crt 10" "count turtles" "10"
+ "A925E39EC022967568D238D31F70F0A375024A89")
+
+(defsimplereportertest "count 3" "count patches" "9"
+ "E1DE30F072D785E0D0B59F28B0F7853E3D3E0D8B")