Rename to clnl, add documentation
authorFrank Duncan <frank@kank.net>
Sun, 28 Jun 2015 18:14:14 +0000 (13:14 -0500)
committerFrank Duncan <frank@kank.net>
Sun, 28 Jun 2015 18:14:14 +0000 (13:14 -0500)
23 files changed:
bin/diagnose-test
bin/run.lisp
bin/test-mode
bin/test-mode.lisp
bin/test.lisp
deps/cl-nl-test.asd [deleted symlink]
deps/cl-nl.asd [deleted symlink]
deps/clnl-test.asd [new symlink]
deps/clnl.asd [new symlink]
src/main/cl-nl.asd [deleted file]
src/main/clnl.asd [new file with mode: 0644]
src/main/lex.lisp
src/main/main.lisp
src/main/nvm.lisp
src/main/package.lisp
src/main/parse.lisp
src/main/random.lisp
src/main/transpile.lisp
src/test/cl-nl-test.asd [deleted file]
src/test/clnl-test.asd [new file with mode: 0644]
src/test/main.lisp
src/test/package.lisp
src/test/simpletests.lisp

index 57fbf28023e1f922e09f2bf8db11a214d6b8db60..23b1603947cf013c61958fed9613958ff55a942d 100755 (executable)
@@ -6,12 +6,12 @@ if ! [ -n "$1" ] ; then
 fi
 TEST=$@
 
-sbcl --eval "(asdf:load-system :cl-nl-test)" --eval "(quit)" &> /dev/null
+sbcl --eval "(asdf:load-system :clnl-test)" --eval "(quit)" &> /dev/null
 
 runtestfn() {
   sbcl --noinform --disable-ldb --lose-on-corruption --end-runtime-options \
-    --eval "(asdf:load-system :cl-nl-test)" \
-    --eval "(cl-nl-test::$1 \"$TEST\")" \
+    --eval "(asdf:load-system :clnl-test)" \
+    --eval "(clnl-test::$1 \"$TEST\")" \
     --eval "(quit)" 2> /dev/null | sed -n '/^----$/,$p' | tail -n +2
 }
 
index b064da16da7096c2ccc4c1d24321c2981f3c63b2..725e8c2c2e0d9e2b5ecc9e6b4bba2af719d00626 100644 (file)
@@ -1,4 +1,4 @@
 (require 'asdf)
 (setf asdf:*central-registry* (list #p"deps/"))
-(asdf:load-system :cl-nl)
-(cl-nl:run)
+(asdf:load-system :clnl)
+(clnl:run)
index 8f6d956f9bf10b6326d566398b4736fe7ff082e0..53c0b9df4472a986f378d48070b1208032a40439 100755 (executable)
@@ -1,4 +1,4 @@
 #!/bin/bash
 
-sbcl --eval "(asdf:load-system :cl-nl-test)" --eval "(quit)" &> /dev/null
+sbcl --eval "(asdf:load-system :clnl-test)" --eval "(quit)" &> /dev/null
 rlwrap sbcl --script bin/test-mode.lisp
index 34182298cc4fc4edb4621e0ba0f7239a83ad40c0..30893257fe96e1c4e83da5b3f0201bb527679f63 100644 (file)
@@ -1,4 +1,4 @@
 (require 'asdf)
 (setf asdf:*central-registry* (list #p"deps/"))
-(asdf:load-system :cl-nl-test)
-(cl-nl-test:run)
+(asdf:load-system :clnl-test)
+(clnl-test:run)
index 536be8212cc19e38821951a759a506fae87a13ed..b3c912a1e8fa89ac744fa9f46a098fb6465baf3a 100644 (file)
@@ -1,4 +1,4 @@
 (require 'asdf)
 (setf asdf:*central-registry* (list #p"deps/"))
-(asdf:load-system :cl-nl-test)
-(sb-ext:quit :unix-status (if (cl-nl-test:run-all-tests) 0 1))
+(asdf:load-system :clnl-test)
+(sb-ext:quit :unix-status (if (clnl-test:run-all-tests) 0 1))
diff --git a/deps/cl-nl-test.asd b/deps/cl-nl-test.asd
deleted file mode 120000 (symlink)
index 33911e7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../src/test/cl-nl-test.asd
\ No newline at end of file
diff --git a/deps/cl-nl.asd b/deps/cl-nl.asd
deleted file mode 120000 (symlink)
index 8cef5e7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../src/main/cl-nl.asd
\ No newline at end of file
diff --git a/deps/clnl-test.asd b/deps/clnl-test.asd
new file mode 120000 (symlink)
index 0000000..3c3cf0e
--- /dev/null
@@ -0,0 +1 @@
+../src/test/clnl-test.asd
\ No newline at end of file
diff --git a/deps/clnl.asd b/deps/clnl.asd
new file mode 120000 (symlink)
index 0000000..2337742
--- /dev/null
@@ -0,0 +1 @@
+../src/main/clnl.asd
\ No newline at end of file
diff --git a/src/main/cl-nl.asd b/src/main/cl-nl.asd
deleted file mode 100644 (file)
index 924a5f6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-(asdf:defsystem cl-nl
-  :name "Experiment"
-  :version "0.0.1"
-  :maintainer "Frank Duncan (frank@kank.com)"
-  :author "Frank Duncan (frank@kank.com)"
-  :serial t
-  :components ((:file "package")
-               (:file "lex")
-               (:file "parse")
-               (:file "nvm")
-               (:file "transpile")
-               (:file "random")
-               (:file "main"))
-  :depends-on (:cl-ppcre :mt19937))
diff --git a/src/main/clnl.asd b/src/main/clnl.asd
new file mode 100644 (file)
index 0000000..b547601
--- /dev/null
@@ -0,0 +1,14 @@
+(asdf:defsystem clnl
+  :name "Experiment"
+  :version "0.0.1"
+  :maintainer "Frank Duncan (frank@kank.com)"
+  :author "Frank Duncan (frank@kank.com)"
+  :serial t
+  :components ((:file "package")
+               (:file "lex")
+               (:file "parse")
+               (:file "nvm")
+               (:file "transpile")
+               (:file "random")
+               (:file "main"))
+  :depends-on (:cl-ppcre :mt19937))
index c7f082fc3d203f82e0e7d267c40236b77802980b..780aec2aeefd1af4d3b6c490661c3053c590525e 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl.lexer)
+(in-package #:clnl-lexer)
 
 ; I played around with using #'read for netlogo code, which would have been neat.
 ; However, it provides too many instances where people could inject CL code
index 9844d36923a1aed078244d6252e94a8e4eb769e7..562304b8fc28e6bb505da1bfebfffdfd37f29b23 100644 (file)
@@ -1,12 +1,12 @@
-(in-package #:cl-nl)
+(in-package #:clnl)
 
 (defun e (ast) ast)
 
 (defun r (str)
  (let*
-  ((lexed-ast (let ((ast (cl-nl.lexer:lex str))) (format t "Via lexing, AST for~%~S~% became~%~S~%~%" str ast) ast))
-   (parsed-ast (let ((ast (cl-nl.parser:parse lexed-ast))) (format t "Via parsing, AST for~%~S~% became~%~S~%~%" lexed-ast ast) ast))
-   (transpiled-ast (let ((ast (cl-nl.transpiler:transpile-commands parsed-ast))) (format t "Via transpiling, AST for~%~S~% became~%~S~%" parsed-ast ast) ast)))
+  ((lexed-ast (let ((ast (clnl-lexer:lex str))) (format t "Via lexing, AST for~%~S~% became~%~S~%~%" str ast) ast))
+   (parsed-ast (let ((ast (clnl-parser:parse lexed-ast))) (format t "Via parsing, AST for~%~S~% became~%~S~%~%" lexed-ast ast) ast))
+   (transpiled-ast (let ((ast (clnl-transpiler:transpile-commands parsed-ast))) (format t "Via transpiling, AST for~%~S~% became~%~S~%" parsed-ast ast) ast)))
   (eval transpiled-ast)))
 
 (defun p (result) result)
        do (p (e (r str)))))
 
 (defun boot ()
- (cl-nl.random:set-seed 15)
- (cl-nl.nvm:create-world)
+ (clnl-random:set-seed 15)
+ (clnl-nvm:create-world)
  )
 
 (defun run-commands (cmds)
- (eval (cl-nl.transpiler:transpile-commands (cl-nl.parser:parse  (cl-nl.lexer:lex cmds)))))
+ (eval (clnl-transpiler:transpile-commands (clnl-parser:parse  (clnl-lexer:lex cmds)))))
 
 (defun run-reporter (reporter)
- (eval (cl-nl.transpiler:transpile-reporter (car (cl-nl.parser:parse (cl-nl.lexer:lex reporter))))))
+ (eval (clnl-transpiler:transpile-reporter (car (clnl-parser:parse (clnl-lexer:lex reporter))))))
index 79b0b36be2fa3d463e95fd02c470a7f1a2de30a0..2c2cdbd65a0491b7bb0d94df61f677fd55dc751c 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl.nvm)
+(in-package #:clnl-nvm)
 
 ; This is the engine.  Yay.
 
@@ -10,6 +10,9 @@
 (defvar *self* nil)
 
 (defun show (n)
+ "Prints value in the Command Center, preceded by this agent, and followed by a carriage return.
+
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#show"
  (format t "Showing: ~A~%" (dump-object n)))
 
 (defun create-turtle ()
    *turtles*
    (list
     (make-turtle :who *current-id*
-                 :color (coerce (+ 5 (* 10 (cl-nl.random:next-int 14))) 'double-float)
-                 :heading (coerce (cl-nl.random:next-int 360) 'double-float)
+                 :color (coerce (+ 5 (* 10 (clnl-random:next-int 14))) 'double-float)
+                 :heading (coerce (clnl-random:next-int 360) 'double-float)
                  :xcor 0d0
                  :ycor 0d0))))
  (incf *current-id*))
 
-(defun turtles () *turtles*)
+(defun turtles ()
+"Reports the agentset consisting of all turtles. 
+
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#turtles"
+ *turtles*)
 
 (defun ask (agent-set fn)
+"The specified agent or agentset runs the given commands.
+
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#ask"
  (let
   ((iter (shufflerator agent-set)))
   (loop for agent = (funcall iter)
@@ -42,7 +52,7 @@
   (flet
    ((fetch ()
      (let
-      ((idx (when (< i (1- (length copy))) (+ i (cl-nl.random:next-int (- (length copy) i))))))
+      ((idx (when (< i (1- (length copy))) (+ i (clnl-random:next-int (- (length copy) i))))))
       (when idx (setf agent (nth idx copy)))
       (when idx (setf (nth idx copy) (nth i copy)))
       (incf i))))
      (t (let ((result agent)) (fetch) result)))))))
 
 (defun random-float (n)
- (cl-nl.random:next-double n))
+"If number is positive, returns a random floating point number greater than or equal to 0 but strictly less than number.
+
+If number is negative, returns a random floating point number less than or equal to 0, but strictly greater than number.
+
+If number is zero, the result is always 0. 
 
-(defun fd (n)
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-float"
+ (clnl-random:next-double n))
+
+(defun forward (n)
+"The turtle moves forward by number steps, one step at a time. (If number is negative, the turtle moves backward.) 
+
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#forward"
  (when (not (turtle-p *self*)) (error "Gotta call fd in turtle scope, dude (~A)" *self*))
  (setf (turtle-xcor *self*) (+ (turtle-xcor *self*) (* n (sin (* pi (/ (turtle-heading *self*) 180))))))
  (setf (turtle-ycor *self*) (+ (turtle-ycor *self*) (* n (cos (* pi (/ (turtle-heading *self*) 180)))))))
 
 (defun create-turtles (n)
+"Creates number new turtles at the origin. New turtles have random integer
+headings and the color is randomly selected from the 14 primary colors.
+
+If commands are supplied, the new turtles immediately run them.
+
+See http://ccl.northwestern.edu/netlogo/docs/dictionary.html#create-turtles"
  (loop for i from 1 to n do (create-turtle)))
 
 (defun create-world ()
  (format nil "~{~A~%~}"
   (list
    (format nil "~S" "RANDOM STATE")
-   (format nil "~S" (cl-nl.random:export))
+   (format nil "~S" (clnl-random:export))
    ""
    (format nil "~S" "GLOBALS")
    "\"min-pxcor\",\"max-pxcor\",\"min-pycor\",\"max-pycor\",\"perspective\",\"subject\",\"nextIndex\",\"directed-links\",\"ticks\","
index cde6c077cf6531dc205c97c8b0fbd0e716880abb..790064a4aa03cffb5d93c95ec9ff279a557a6d41 100644 (file)
@@ -1,23 +1,36 @@
-(defpackage #:cl-nl (:use :common-lisp)
+(defpackage #:clnl (:use :common-lisp)
  (:export :run :boot :run-commands :run-reporter))
 
-(defpackage #:cl-nl.parser
+(defpackage #:clnl-parser
  (:use :common-lisp)
  (:export :parse))
 
-(defpackage #:cl-nl.random
+(defpackage #:clnl-random
  (:use :common-lisp)
  (:shadow #:export)
  (:export #:export #:set-seed #:next-int #:next-double))
 
-(defpackage #:cl-nl.transpiler
+(defpackage #:clnl-transpiler
  (:use :common-lisp)
  (:export :transpile-commands :transpile-reporter))
 
-(defpackage #:cl-nl.nvm
+(defpackage #:clnl-nvm
  (:use :common-lisp)
- (:export :export-world :create-world :dump-object))
+ (:export :export-world :create-world :dump-object
+  ; API as used by transpiled NetLogo programs
+  #:ask
+  #:create-turtles
+  #:forward
+  #:random-float
+  #:show
+  #:turtles
 
-(defpackage #:cl-nl.lexer
+  ))
+
+(defpackage #:clnl-lexer
  (:use :common-lisp)
  (:export :lex))
+
+(defpackage #:clnl-interface
+ (:use :common-lisp))
+
index 65200d3e5927c01d22e3ff526c4e9399454a4955..10e2f08aa25575207dab84d1433eae82e919188a 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl.parser)
+(in-package #:clnl-parser)
 
 ; Ok, after thinking about this a little, the parser is completely contextual
 ; based on what has come before.  We can't do a contextless parsing, like we
index 6c9ecaa7c6fd42b6d4cba8653d665b74a42c29a2..6f500a979558a57fdd519d4323878ab43a5e8052 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl.random)
+(in-package #:clnl-random)
 
 ; This is a wrapper around the very nice mersenne twister mt19937 to match
 ; NetLogo's implementation that tries to match how java.util.Random works
index db31840ddd35b7f5c4e940a0dee535a94dfaad41..e4ca36029d46608c0e3d5b4933f89b982c723ee8 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl.transpiler)
+(in-package #:clnl-transpiler)
 
 ; This is responsible for taking an ast and turning it into valid CL code
 ; targeting the nvm.  Here is where start to care about commands versus reporters
@@ -9,6 +9,10 @@
 ; or a reporter.  So monitors can say "hey, transpile this reporter" and we'll check
 ; to make sure it actually is.
 
+; Furthermore, the lisp code that any netlogo code would be transpiled to should
+; use exported symbols, such that anyone writing NetLogo code in lisp could use
+; the nvm in the same way that comes out of this transpiler
+
 (defparameter *prims* nil)
 
 (defun prim-name (prim) (getf prim :name))
@@ -51,9 +55,9 @@
    *prims*))
 
 ; We count on the parser to handle arguemnts for us, when collating things.
-(defprim :ask :command cl-nl.nvm::ask)
-(defprim :crt :command cl-nl.nvm::create-turtles)
-(defprim :fd :command cl-nl.nvm::fd)
-(defprim :random-float :reporter cl-nl.nvm::random-float)
-(defprim :show :command cl-nl.nvm::show)
-(defprim :turtles :reporter cl-nl.nvm::turtles)
+(defprim :ask :command clnl-nvm:ask)
+(defprim :crt :command clnl-nvm:create-turtles)
+(defprim :fd :command clnl-nvm:forward)
+(defprim :random-float :reporter clnl-nvm:random-float)
+(defprim :show :command clnl-nvm:show)
+(defprim :turtles :reporter clnl-nvm:turtles)
diff --git a/src/test/cl-nl-test.asd b/src/test/cl-nl-test.asd
deleted file mode 100644 (file)
index 37fe158..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-(asdf:defsystem cl-nl-test
-  :name "Experiment Tests"
-  :version "0.0.1"
-  :maintainer "Frank Duncan (frank@kank.com)"
-  :author "Frank Duncan (frank@kank.com)"
-  :serial t
-  :components ((:file "package")
-               (:file "main")
-               (:file "simpletests"))
-  :depends-on (:cl-nl :ironclad))
diff --git a/src/test/clnl-test.asd b/src/test/clnl-test.asd
new file mode 100644 (file)
index 0000000..156739f
--- /dev/null
@@ -0,0 +1,10 @@
+(asdf:defsystem clnl-test
+  :name "Experiment Tests"
+  :version "0.0.1"
+  :maintainer "Frank Duncan (frank@kank.com)"
+  :author "Frank Duncan (frank@kank.com)"
+  :serial t
+  :components ((:file "package")
+               (:file "main")
+               (:file "simpletests"))
+  :depends-on (:clnl :ironclad))
index 4c375c605bfa4eb6ad791847a628892f230f506f..d24b337f02342fa21f3d62875e9ef623c29b23be 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl-test)
+(in-package #:clnl-test)
 
 (defparameter *tests* nil)
 
  `(defsimpletest
    ,name
    (lambda ()
-    (cl-nl:boot)
-    (cl-nl:run-commands ,commands)
+    (clnl:boot)
+    (clnl:run-commands ,commands)
     (string= ,checksum (checksum-world)))
    (lambda ()
-    (cl-nl:boot)
-    (cl-nl:run-commands ,commands)
+    (clnl:boot)
+    (clnl:run-commands ,commands)
     (format nil "~A~A"
-     (cl-nl.nvm:export-world)
+     (clnl-nvm:export-world)
      (checksum-world)))
    "bin/runcmd.scala"
    (format nil "~A~%" ,commands)))
  `(defsimpletest
    ,name
    (lambda ()
-    (cl-nl:boot)
+    (clnl:boot)
     (and
-     (string= (cl-nl.nvm:dump-object (cl-nl:run-reporter ,reporter)) ,value)
+     (string= (clnl-nvm:dump-object (clnl:run-reporter ,reporter)) ,value)
      (string= ,checksum (checksum-world))))
    (lambda ()
-    (cl-nl:boot)
+    (clnl:boot)
     (format nil "~A~%~A~A"
-     (cl-nl.nvm:dump-object (cl-nl:run-reporter ,reporter))
-     (cl-nl.nvm:export-world)
+     (clnl-nvm:dump-object (clnl:run-reporter ,reporter))
+     (clnl-nvm:export-world)
      (checksum-world)))
    "bin/runreporter.scala"
    (format nil "~A~%" ,reporter)))
@@ -81,9 +81,9 @@
   (map 'list #'identity
    (ironclad:digest-sequence
     :sha1
-    (map '(vector (unsigned-byte 8)) #'char-code (cl-nl.nvm:export-world))))))
+    (map '(vector (unsigned-byte 8)) #'char-code (clnl-nvm:export-world))))))
 
 (defun run ()
  (loop for str = (progn (format t "> ") (force-output) (read-line))
        while str
-       do (progn (asdf:load-system :cl-nl-test) (run-tests-matching str))))
+       do (progn (asdf:load-system :clnl-test) (run-tests-matching str))))
index 316d07d46ea3f4df1f31f946272a31492e4fffc7..3947b64f686af5f370a3ca4878526d42bd205e58 100644 (file)
@@ -1,2 +1,2 @@
-(defpackage #:cl-nl-test (:use :common-lisp :cl-nl)
+(defpackage #:clnl-test (:use :common-lisp :clnl)
  (:export :run-all-tests :run :test-debug))
index b47ac89f1c181c64e2ff35b316d5ccfd835f93ca..8427ef0c941d2373b190b2bb4f5ad01966c0e374 100644 (file)
@@ -1,4 +1,4 @@
-(in-package #:cl-nl-test)
+(in-package #:clnl-test)
 
 (defsimplecommandtest "Nothing" "" "E1DE30F072D785E0D0B59F28B0F7853E3D3E0D8B")
 (defsimplecommandtest "Simple crt" "crt 1" "2F08B31AC06C9D5339E6B3E953C2B4B71FDB9CDE")