环请求图解构宏

时间:2016-03-07 08:29:48

标签: clojure macros compojure ring

尝试使用宏从环形请求图中进行宏解构参数。它运作正常:

(defmacro defpage [fname args & body]
  `(defn ~fname [{{:keys ~args} :params}]
     ~@body))

(defpage h-projects [name description]
  ; some code using name and description...
   )

(defroutes app-routes
   (ANY "/p/" [] h-projects)

但是,我希望能够直接在h-projects函数中使用请求映射:

(defpage h-projects [name description]
  ; some code using name and description, and also
  ; the request map.
   )

如何修改defpage宏以使请求图可用于h-projects函数?

我知道我可以更改h-projects函数的参数,但我想保留带参数的简单向量,而不是som深嵌套解构图。

1 个答案:

答案 0 :(得分:1)

You can destructure with the :as keyword to get a handle on the entire destructured map.要在宏中执行此操作,我建议您输入名称应该是什么:

(defmacro defpage [fname args map-name & body]
  `(defn ~fname [{{:keys ~args :as ~map-name} :params}]
     ~@body))

但您也可以选择仅定义所有defpage共享的“魔术名称”。这种情况会失去清晰度,因为当你读到一个defpage时,它看起来就像是一个无处不在的名字。

(defmacro defpage [fname args & body]
  `(defn ~fname [{{:keys ~args :as ~'my-magic-name} :params}]
     ~@body))

〜'允许命名空间捕获。