common lisp在宏

时间:2016-09-06 14:44:23

标签: macros common-lisp hunchentoot

我正在尝试在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之上工作的库(我发现了一些但不知道选择哪一个,所以我开始自己编写)。

非常感谢你!

1 个答案:

答案 0 :(得分:3)

只需几点,还有更多:

有一个很好的服务器抽象层,名为lack:https://github.com/fukamachi/lack

有了它,您可以非常简单地构建自己的路由机制,或者使用现有的ningle或caveman。

还有RESTAS,它直接在Hunchentoot上构建。

至于你的想法:我强烈建议不要使用文件加载/文件名修改语言机制。您应该能够简单地加载顶层表单来表达任何内容,以便您可以在系统定义中布局整个应用程序结构,最重要的是,保持基于简单图像的开发周期。您的代码不需要知道它存储在文件中。