尝试使用宏从环形请求图中进行宏解构参数。它运作正常:
(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深嵌套解构图。
答案 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))
〜'允许命名空间捕获。