(loop
   :for str := (cffi:with-foreign-pointer-as-string (str 255) (wgetnstr *cli* str 255))
   :while str
-  :while (and (string/= str "q") (string/= str "Q"))
   :do (print-command-and-response str (execute str)))
  (endwin)
  (sb-ext:exit :abort t))
   implementation of NetLogo.
   
   You can enter in various netlogo commands below,
-  or use q to quit the program.
+  or use :q to quit the program.
   
   See http://github.com/frankduncan/clnl for more
   information about CLNL and to keep apprised of
 
 DESCRIPTION:
 
   PRIMS returns the primitives used in the CLI extension."
- nil)
+ (list
+  (list :name :q :type :command :func #'shut-down)))
+
+(defun shut-down ()
+ (cl-charms/low-level:endwin)
+ (sb-ext:exit :abort t))
 
  (sb-thread:make-thread #'clnl-cli:run)
  (clnl-interface:run))
 
+(defvar *callback* nil)
+
 (defun boot (&optional file headless-mode)
  "BOOT &optional FILE HEADLESS-MODE => RESULT
 
   ((netlogoed-lisp
     (model->single-form-lisp
      (if file (with-open-file (str file) (clnl-model:read-from-nlogo str)) (clnl-model:default-model))
-     :initialize-interface (not headless-mode)))
+     :initialize-interface (not headless-mode)
+     :netlogo-callback (lambda (f) (setf *callback* f))))
    (*package* *model-package*))
   (eval netlogoed-lisp)))
 
 
   RUN-COMMANDS will take NetLogo commands, put them through the various
   stages need to turn them into Common Lisp code, and run it."
- (clnl-nvm:with-stop-handler (eval (clnl-transpiler:transpile (clnl-parser:parse (clnl-lexer:lex cmds))))))
+ (clnl-nvm:with-stop-handler
+  (funcall *callback* cmds)))
 
 (defun run-reporter (reporter)
  "RUN-REPORTER REPORTER => RESULT