From 399b297b01fe363c6ea8c2108de5df82c2ba3921 Mon Sep 17 00:00:00 2001 From: Frank Duncan Date: Sun, 24 Apr 2016 12:21:32 -0500 Subject: [PATCH] Prims - Implement colors, nobody --- src/main/nvm/nvm.lisp | 31 +++++++++++++++++++++++++++++++ src/main/package.lisp | 1 + src/main/transpile.lisp | 19 ++++++++++++++++--- src/test/simpletests.lisp | 6 ++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/main/nvm/nvm.lisp b/src/main/nvm/nvm.lisp index c5f0865..47f5467 100644 --- a/src/main/nvm/nvm.lisp +++ b/src/main/nvm/nvm.lisp @@ -17,6 +17,37 @@ DESCRIPTION: See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#show" (format t "Showing: ~A~%" (dump-object value))) +(defun lookup-color (color) + "LOOKUP-COLOR COLOR => COLOR-NUMBER + +ARGUMENTS AND VALUES: + + COLOR: a symbol representing a color + COLOR-NUMBER: the NetLogo color integer + +DESCRIPTION: + + Returns the number used to represent colors in NetLogo. + + See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#Constants" + (case color + (:black 0d0) + (:gray 5d0) + (:white 9.9d0) + (:red 15d0) + (:orange 25d0) + (:brown 35d0) + (:yellow 45d0) + (:green 55d0) + (:lime 65d0) + (:turquoise 75d0) + (:cyan 85d0) + (:sky 95d0) + (:blue 105d0) + (:violet 115d0) + (:magenta 125d0) + (:pink 135d0))) + (defun create-turtle () (setf *turtles* diff --git a/src/main/package.lisp b/src/main/package.lisp index 392d92b..36fbafa 100644 --- a/src/main/package.lisp +++ b/src/main/package.lisp @@ -70,6 +70,7 @@ into an ast that can be transpiled later.")) #:create-turtles #:die #:forward + #:lookup-color #:random-float #:show #:turtles diff --git a/src/main/transpile.lisp b/src/main/transpile.lisp index 9b4b5ee..a45183b 100644 --- a/src/main/transpile.lisp +++ b/src/main/transpile.lisp @@ -10,9 +10,10 @@ (defun is-command (prim) (eql :command (getf prim :type))) (defun find-prim (symb) - (or - (find symb *prims* :key #'prim-name) - (find-prim (getf (find symb *prim-aliases* :key #'prim-name) :real-symb)))) + (when symb + (or + (find symb *prims* :key #'prim-name) + (find-prim (getf (find symb *prim-aliases* :key #'prim-name) :real-symb))))) ; Let this grow, slowly but surely, eventually taking on calling context, etc. ; For now, it's just a @@ -82,6 +83,9 @@ DESCRIPTION: (defmacro defsimpleprim (name type simple-func) `(defprim ,name ,type (lambda (&rest args) `(,',simple-func ,@args)))) +(defmacro defkeywordprim (name) + `(defprim ,name :reporter (lambda () ',name))) + (defmacro defprim-alias (name real-symb) `(push (list :name ,name :real-symb ,real-symb) *prim-aliases*)) @@ -108,7 +112,16 @@ DESCRIPTION: (defprim-alias :if-else :ifelse) (defsimpleprim :lt :command clnl-nvm:turn-left) +(defkeywordprim :nobody) (defsimpleprim :random-float :reporter clnl-nvm:random-float) (defsimpleprim :rt :command clnl-nvm:turn-right) (defsimpleprim :show :command clnl-nvm:show) (defsimpleprim :turtles :reporter clnl-nvm:turtles) + +; Colors +(defmacro defcolorprim (color) `(defprim ,color :reporter (lambda () `(clnl-nvm:lookup-color ,,color)))) +(defcolorprim :black) +(defcolorprim :blue) +(defcolorprim :brown) +(defcolorprim :green) +(defcolorprim :white) diff --git a/src/test/simpletests.lisp b/src/test/simpletests.lisp index 119e12f..c2a11ba 100644 --- a/src/test/simpletests.lisp +++ b/src/test/simpletests.lisp @@ -131,3 +131,9 @@ (defsimplecommandtest "ifelse 2" "ifelse 5 = 4 [ crt 10 ] [ crt 5 ] if-else 5 = 4 [ crt 10 ] [ crt 5 ]" "A925E39EC022967568D238D31F70F0A375024A89") + +(defsimplereportertest "colors 1" "green" "55" + "E1DE30F072D785E0D0B59F28B0F7853E3D3E0D8B") + +(defsimplereportertest "colors 2" "black" "0" + "E1DE30F072D785E0D0B59F28B0F7853E3D3E0D8B") -- 2.25.1