2

我正在使用 HT-SIMPLE-AJAX 在 AJAX 上提供一个简单的 JSON 结构。如果在 lisp 镜像和服务器启动之后defun-ajax编译定义的函数,它会很好地工作。

如果我使用定义的函数加载 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。

4

1 回答 1

5

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

您应该始终对函数体中出现的 , 等形式defvar非常defun怀疑。defparameter他们不属于那里。将它们作为顶级表单放置,以便将它们作为程序的一部分加载。在显示的函数运行期间定义的大部分内容start实际上应该是顶级表单。

于 2018-03-21T23:22:00.007 回答