环请求图解构宏

Ring request map deconstruction macro

正在尝试使用宏从环请求映射中解构参数。工作正常:

(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 函数的参数,但我想保留带有参数的简单向量,而不是一些深层嵌套的解构图。

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 共享的 "magic name"。这有点不清晰,因为当你读到 defpage 时,它看起来像是凭空冒出来的名字。

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

~' 允许命名空间捕获。