Prims - Update one-of to take lists. Rename agent-set to agentset
[clnl] / src / main / parse.lisp
index ad9f746a211d8e15bf1d2a3d4e55e2f41ab46531..9c805749c26aaadc76e3d1fa96ebb82393f3c8c2 100644 (file)
@@ -99,8 +99,8 @@ DESCRIPTION:
        (parse-internal (cdr lexed-ast)
         :prev-item (coerce (car lexed-ast) 'double-float)
         :arg-countdown (when arg-countdown (1- arg-countdown))))
-      ((eql (intern "(" (find-package :keyword)) (car lexed-ast)) (parse-parened-expr (cdr lexed-ast) arg-countdown))
-      ((eql (intern ")" (find-package :keyword)) (car lexed-ast)) (error "Closing parens has no opening parens"))
+      ((eql (intern "(" :keyword) (car lexed-ast)) (parse-parened-expr (cdr lexed-ast) arg-countdown))
+      ((eql (intern ")" :keyword) (car lexed-ast)) (error "Closing parens has no opening parens"))
       ((eql :let (car lexed-ast)) (parse-let (cdr lexed-ast) arg-countdown))
       ((eql :[ (car lexed-ast)) (parse-block (cdr lexed-ast) arg-countdown))
       (prim
@@ -138,16 +138,16 @@ DESCRIPTION:
       (butlast half-parsed-remainder (- (length half-parsed-remainder) num-args))))))))
 
 (defun help-arg (arg-type arg)
- (case arg-type
-  (:command-block
+ (cond
+  ((eql arg-type :command-block)
    (if (not (and (consp arg) (eql 'block (car arg))))
     (error "Required a block, but found a ~A" arg)
     (cons :command-block (cdr arg))))
-  (:reporter-block
+  ((eql arg-type :reporter-block)
    (if (not (and (consp arg) (eql 'block (car arg))))
     (error "Required a block, but found a ~A" arg)
     (cons :reporter-block (cdr arg))))
-  (:list
+  ((or (eql arg-type :list) (and (listp arg-type) (find :list arg-type)))
    (if (and (consp arg) (eql 'block (car arg)))
     (cons :list-literal (cdr arg))
     arg))
@@ -181,14 +181,14 @@ DESCRIPTION:
 (defun find-closing-paren (tokens &optional (depth 0))
  (cond
   ((not tokens) (error "Failed to find a matching closing bracket"))
-  ((and (eql (intern ")" (find-package :keyword)) (car tokens)) (= depth 0)) (values nil (cdr tokens)))
+  ((and (eql (intern ")" :keyword) (car tokens)) (= depth 0)) (values nil (cdr tokens)))
   (t (multiple-value-bind
       (in-block after-block)
       (find-closing-paren
        (cdr tokens)
        (cond
-        ((eql (intern "(" (find-package :keyword)) (car tokens)) (1+ depth))
-        ((eql (intern ")" (find-package :keyword)) (car tokens)) (1- depth)) (t depth)))
+        ((eql (intern "(" :keyword) (car tokens)) (1+ depth))
+        ((eql (intern ")" :keyword) (car tokens)) (1- depth)) (t depth)))
       (values (cons (car tokens) in-block) after-block)))))
 
 (defmacro defprim (name args &optional infix)
@@ -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))
@@ -238,7 +238,8 @@ DESCRIPTION:
 (defprim :label-color ())
 (defprim :not (:boolean))
 (defprim :nobody ())
-(defprim :one-of (t))
+(defprim :one-of ((:agentset :list)))
+(defprim :of (:reporter-block :agentset) :infix)
 (defprim :patches ())
 (defprim :pcolor ())
 (defprim :random (:number))
@@ -256,7 +257,9 @@ DESCRIPTION:
 (defprim :size ())
 (defprim :stop ())
 (defprim :tick ())
+(defprim :ticks ())
 (defprim :turtles ())
+(defprim :who ())
 
 ; colors
 (defprim :black ())
@@ -271,12 +274,3 @@ DESCRIPTION:
 (defstructureprim :patches-own)
 (defstructureprim :to)
 (defstructureprim :to-report)
-
-; Placeholder prims that should be populated in dynamic prims
-
-; Generated by breeds
-(defprim :sheep ())
-(defprim :wolves ())
-(defprim :create-sheep (:number :command-block))   ; look at me not have to do optionals yet
-(defprim :sheep-here ())
-(defprim :create-wolves (:number :command-block))