我正在尝试在hunchentoot服务器的常见lisp中写一些类似于ruby的路由文件,即。,
(route "/home" :controller home :action index)
示例控制器文件是这样的:
;;; controller file
(defun index ()
;; do something
)
(defun add (x)
;; do something
)
原因是将控制器与视图分开。
所以,我有以下功能:
(defun build-handler (controller action)
(intern (concatenate 'string (symbol-name controller) "-" (symbol-name action))))
(defun format-view-file (controller params)
(let ((fstring (read-from-view-file))) ; the view file must be named after the controller. the details are not shown here
(format nil fstring params)))
(defun get-action-arguments (f)
;; read the controller file
;; and find the action function
;; return a list of its arguments
;; something like this, in case f was "(defun bar (x) (1+ x))"
(car (cdr (cdr f))))
和宏:
(defmacro route (uri &key controller action)
(let ((var (build-handler controller action))
(params (get-action-arguments action)))
`(hunchentoot:define-easy-handler (,var :uri ,uri) ,params
(setf (hunchentoot:content-type*) "text/plain")
(format-view-file ,params))))
我的问题是我无法正确传递参数。 params如何在路径宏中?
或者,是否有更好的方法来实现这一点,或者是否有一个在hunchentoot之上工作的库(我发现了一些但不知道选择哪一个,所以我开始自己编写)。
非常感谢你!
答案 0 :(得分:3)
只需几点,还有更多:
有一个很好的服务器抽象层,名为lack:https://github.com/fukamachi/lack。
有了它,您可以非常简单地构建自己的路由机制,或者使用现有的ningle或caveman。
还有RESTAS,它直接在Hunchentoot上构建。
至于你的想法:我强烈建议不要使用文件加载/文件名修改语言机制。您应该能够简单地加载顶层表单来表达任何内容,以便您可以在系统定义中布局整个应用程序结构,最重要的是,保持基于简单图像的开发周期。您的代码不需要知道它存储在文件中。