错误:未绑定变量:* AJAX-PROCESSOR *使用HT-SIMPLE-AJAX

时间:2018-03-21 22:29:24

标签: common-lisp hunchentoot

我正在使用HT-SIMPLE-AJAX来提供一个简单的JSON结构而不是AJAX。如果defun-ajax定义的函数在之后编译了lisp图像并启动了服务器,那么它的工作效果非常好。

如果我使用定义的函数加载lisp程序(带ccl --load),我会收到此错误:

  

错误:未绑定变量:* AJAX-PROCESSOR *   执行:#,在进程监听器(1)中。

     

键入:GO继续,:POP中止,:R表示可用的重新启动列表。   如果继续:跳过加载“/home/hunchentoot/quicklisp/local-projects/gac-man/run.lisp”   类型:?其他选择。

功能如下:

(defun-ajax machine-info (serial) (*ajax-processor*)
  (let* ((serialn (remove #\" serial)))
    (concatenate 'string
     "Lots of boring stuff" "here")))

ajax处理器是在另一个函数中创建的,在程序开始时调用:

(defun start ()
  (setup)
  (connect-to-database)
  (defvar *web-server* (start (make-instance 'hunchentoot:easy-acceptor :port 8080
                     :document-root #p"~/www/")))
  (defvar *ajax-processor* 
  (make-instance 'ajax-processor :server-uri "/ajax"))
  (print "Starting web server...")
  (setf *show-lisp-errors-p* t
    *show-lisp-backtraces-p* t)
  (define-easy-handler (docroot :uri "/") () (docroot)
  ....
  ....
   (setq *dispatch-table* (list 'dispatch-easy-handlers 
               (create-ajax-dispatcher *ajax-processor*)))))

然而,如果我启动所有内容然后通过slime编译函数,它可以正常工作。为什么会出现此错误?

我在64位Linux上使用Clozure Common Lisp。

1 个答案:

答案 0 :(得分:5)

defun-ajax函数运行之前,您的start表单似乎已加载。这并不奇怪。通常,所有代码都会被加载,然后才会调用入口点。

您应始终对出现在函数正文中的defvardefundefparameter等表单非常怀疑。他们不属于那里。将它们作为顶层表单放置,因此它们作为程序的一部分加载。在显示的start函数运行期间定义的大部分内容应该是顶层形式。