2016-03-07 2 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) 

Но, я хотел бы иметь возможность использовать карту запрос непосредственно в функции ч-проектов:

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

Как defpage макрос может быть изменен, чтобы сделать запрос карта доступна для функции h-projects?

Я знаю, что могу изменить параметры функции h-projects, но я хотел бы сохранить простой вектор с параметрами, а не с глубокой вложенной деконструирующей картой.

ответ

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

Ваш ответ, кажется, частично работает. Макрос не-магии работает, но макрос с именем my-magic вводит следующую ошибку: java.lang.RuntimeException: Невозможно дать квалифицированное имя: my-magic-name, компиляция – Drewes

+0

A ~ 'до my-magic- имя, и оно работает – Drewes

Смежные вопросы