Model export as lisp - Wolf sheep
authorFrank Duncan <frank@kank.net>
Sat, 4 Jun 2016 16:34:55 +0000 (11:34 -0500)
committerFrank Duncan <frank@kank.net>
Sat, 4 Jun 2016 16:34:55 +0000 (11:34 -0500)
bin/buildlinuxexec.sh
src/main/extensions/cli/cli.lisp
src/main/main.lisp
src/main/package.lisp

index 37c6d8a230ac257ac88e6ce8c337606ae1710198..d13d6fe767fc2b7c28250231daf2ee7f23300ef5 100755 (executable)
@@ -31,8 +31,9 @@ mkdir -p tmp/deps/
 
 SBCL_HOME="" tmp/sbcl/bin/sbcl --core tmp/sbcl/lib/sbcl/sbcl.core \
   --eval "(require 'asdf)" \
-  --eval "(asdf:initialize-source-registry '(:source-registry (:tree \"${PWD}/tmp/deps\") (:directory \"${PWD}/src/main\") :IGNORE-INHERITED-CONFIGURATION))" \
+  --eval "(asdf:initialize-source-registry '(:source-registry (:tree \"${PWD}/tmp/deps\") (:tree \"${PWD}/src/main\") :IGNORE-INHERITED-CONFIGURATION))" \
   --eval "(asdf:load-system :clnl)" \
+  --eval "(asdf:load-system :clnl-extension-cli)" \
   --eval "(asdf:clear-output-translations)" \
   --eval '(sb-ext:save-lisp-and-die "clnl" :executable t :toplevel (function clnl:run))'
 
index 6d24da7fd941542af047f7054a6ebaa73a3ebc1d..3ca09835b1f42794ef540f5683cec90c48b39106 100644 (file)
@@ -31,5 +31,5 @@ DESCRIPTION:
     (:|:LOAD|
      (concatenate 'string
       ":load <filename> loads up a model into the current clnl instance."
-      " Try :load \"resources/models/Wolf Sheep Predation.nlogo\""))
+      " Try :load \"Wolf Sheep Predation.nlogo\""))
     (t (format nil "Don't have help for ~S" token))))))
index a226642c8e702b63cbabb49321e7108aed1cd6af..b0d82ebb2a00d2c721c6da4664a093f177509ddc 100644 (file)
@@ -129,6 +129,64 @@ DESCRIPTION:
            prim)) prims)))
     :undefined)))
 
+(defun nlogo->lisp (str pkg-symb boot-fn &key (seed 15) initialize-interface netlogo-callback-fn)
+ (let*
+  ((model (clnl-model:read-from-nlogo str))
+   (shadow-symbs
+    (remove nil
+     (mapcar
+      (lambda (proc-symb)
+       (multiple-value-bind (found external) (find-symbol (symbol-name proc-symb) :cl)
+        (when (and found (eql :external external)) proc-symb)))
+      (mapcar #'car
+       (clnl-code-parser:procedures
+        (clnl-code-parser:parse
+         (clnl-lexer:lex (clnl-model:code model))
+         (clnl-model:widget-globals model))))))))
+  (eval
+   `(progn
+     (defpackage ,pkg-symb (:use :common-lisp) (:shadow ,@shadow-symbs))
+     (,(intern "IN-PACKAGE" :cl) ,pkg-symb) ; intern because of style check
+     (cons
+      `(defpackage ,,pkg-symb (:use :common-lisp) (:shadow ,,@shadow-symbs))
+      (let
+       ((clnl:*model-package* (find-package ,pkg-symb)))
+       (clnl:model->multi-form-lisp
+        ,model
+        (intern (symbol-name ',boot-fn) ,pkg-symb)
+        :seed ,seed
+        :initialize-interface ,initialize-interface
+        :netlogo-callback-fn ,netlogo-callback-fn)))))))
+
+(setf (documentation 'nlogo->lisp 'function)
+ "NLOGO->LISP STR PKG-SYMB BOOT-FN &key SEED INITIALIZE-INTERFACE NETLOGO-CALLBACK-FN => FORMS
+
+ARGUMENTS AND VALUES:
+
+  STR: A stream holding an nlogo file
+  PKG-SYMB: A symbol for the generated package
+  BOOT-FN: A function name
+  SEED: An integer, defaults to 15
+  INITIALIZE-INTERFACE: A boolean
+  NETLOGO-CALLBACK-FN: a symbol
+  FORMS: A list of common lisp form
+
+DESCRIPTION:
+
+  NLOGO->LISP takes a stream STR and returns a multi form lisp program,
+  that when executed, sets up the model.  See MODEL->MULTI-FORM-LISP for
+  more information.
+
+  NLOGO->LISP does extra work of setting up the package to be named by
+  PKG-SYMB in order to correctly shadow common lisp functions.
+
+  It will also change the current package to the one created for the model
+  named by PKG-SYMB.
+
+EXAMPLES:
+
+  (with-open-file (str \"Wolf Sheep Predation.nlogo\") (nlogo->lisp str :wolfsheep 'boot)) => (forms)")
+
 (defun model->single-form-lisp (model &key (seed 15) initialize-interface netlogo-callback)
  (multiple-value-bind
   (code-ast prims)
index 8bafc43160219450c8a5a276a251da64e6bfb86e..73ae492f3b994e8a9bd0dcf565b60cb5e23c577c 100644 (file)
@@ -1,7 +1,8 @@
 (defpackage #:clnl (:use :common-lisp)
  (:export
   #:run #:boot #:run-commands #:run-reporter #:*model-package*
-  #:model->multi-form-lisp #:model->single-form-lisp)
+  #:model->multi-form-lisp #:model->single-form-lisp
+  #:nlogo->lisp)
  (:documentation
   "Main CLNL package