2016-03-07 20 views
2

试图让从使用宏环请求地图宏解构参数。它的工作原理确定:环请求地图解构宏

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

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

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

但是,我想能够直接在H-项目功能使用请求地图:

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

如何才能defpage宏进行修改,以使该请求地图可用于h-projects功能?

我知道我可以改变的参数为H-项目功能,但我想保持简单的向量与参数,而不是索姆深嵌套的解构图。

回答

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}] 
    [email protected])) 

,但你也可以选择只定义了“神奇的名字”所有defpage小号分享。这有点失去了清晰度,因为当你读一个defpage它看起来像一个名字出来的芳踪。

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

〜'允许命名空间捕获。

+0

你的回答似乎部分工作。非魔法宏的工作,但我的魔法名称宏引入了以下错误:了java.lang.RuntimeException:不能让合格的名称:我的魔法名称,我-magic-之前编译 – Drewes

+0

A〜”名称,它的作品 – Drewes