我对Common Lisp(SBCL)和Hunchentoot(使用Quicklisp)相对较新。有人能告诉我如何才能让它发挥作用吗?我正在尝试将Hunchentoot服务器和一些路径作为一个单元包装在一个函数中。当我运行它时,只有Hunchentoot的索引页面可用,路径/ a和/ b不可用。
(defun app0 (port)
(let ((*dispatch-table* nil) (server (make-instance 'hunchentoot:acceptor :port port)))
(push (hunchentoot:create-prefix-dispatcher "/a" (lambda () "a")) *dispatch-table*)
(push (hunchentoot:create-prefix-dispatcher "/b" (lambda () "b")) *dispatch-table*)
(hunchentoot:start server) server))
答案 0 :(得分:3)
据我所见,存在多个问题。首先,通过*dispatch-table*
处理请求,要求接受者属于easy-acceptor
类型,即您必须
(make-instance 'easy-acceptor ...)
documentation有详细信息。
第二个问题是,您在设置代码期间重新绑定*dispatch-table*
,并将新值推送到此绑定中。由于在let
完成后恢复绑定(并且hunchentoot:start
异步工作),因此当服务器运行时,*dispatch-table*
中的条目实际上会丢失。尝试
(push (hunchentoot:create-prefix-dispatcher "/a" (lambda () "a")) *dispatch-table*)
(push (hunchentoot:create-prefix-dispatcher "/b" (lambda () "b")) *dispatch-table*)
在顶级(或在专用设置功能中执行类似操作)。如果您不喜欢全局*dispatch-table*
方法,您还可以创建acceptor
的子类,并覆盖acceptor-dispatch-request
(从而实现您喜欢的任何类型的调度)。
正如旁注:您不会在*dispatch-table*
的前缀中添加前缀hunchentoot
的前缀:use
。这只是一个复制/粘贴错误,还是在您的实际代码中也是如此?如果您的代码所在的任何地方都没有hunchentoot
hunchentoot:*dispatch-table*
个套餐,那么您还必须将调度表限定为(defclass vhost (tbnl:acceptor)
((dispatch-table
:initform '()
:accessor dispatch-table
:documentation "List of dispatch functions"))
(:default-initargs
:address "127.0.0.1"))
(defmethod tbnl:acceptor-dispatch-request ((vhost vhost) request)
(mapc (lambda (dispatcher)
(let ((handler (funcall dispatcher request)))
(when handler
(return-from tbnl:acceptor-dispatch-request (funcall handler)))))
(dispatch-table vhost))
(call-next-method))
(defvar vhost1 (make-instance 'vhost :port 50001))
(defvar vhost2 (make-instance 'vhost :port 50002))
(push
(tbnl:create-prefix-dispatcher "/foo" 'foo1)
(dispatch-table vhost1))
(push
(tbnl:create-prefix-dispatcher "/foo" 'foo2)
(dispatch-table vhost2))
(defun foo1 () "Hello")
(defun foo2 () "Goodbye")
(tbnl:start vhost1)
(tbnl:start vhost2)
。
修改(以解决评论部分中的问题)有一个example in the hunchentoot documentation,它似乎完全符合您的要求:
tbnl
(为简洁起见,文档中的注释已删除)。 hunchentoot
是包awk 'BEGIN{
FS=OFS=";"
CONVFMT="%.2f"
}
{
c2+=$2; c5+=$5
}
END{
$2=c2; $5=c5;
print
}' file1 file2 file3
的预定义昵称。您可以互换使用,虽然我建议您选择一个并坚持下去。混合两者可能会产生混淆。