有没有一些方法可以避免clojure中的这种重复代码?
我得到一些参数,然后调用一个接受参数映射的函数。 映射的键名称是参数的名称,如下所示:有没有一些方法可以避免clojure中的这种重复代码?,clojure,Clojure,我得到一些参数,然后调用一个接受参数映射的函数。 映射的键名称是参数的名称,如下所示: (GET "/api/search" [nick_name gender phone max_age min_age page lmt ] (db-search-users :nick_name nick_name :gender gender :phone phone :max_age max_age :min_age min_age :page page :lmt lmt)) 有什
(GET "/api/search" [nick_name gender phone max_age min_age page lmt ]
(db-search-users :nick_name nick_name :gender gender :phone phone
:max_age max_age :min_age min_age :page page :lmt lmt))
有什么方法可以避免复制和粘贴吗?让宏为您完成这项工作:
(defmacro make-get [path & keywords]
`(GET ~path [~@keywords]
(db-search-users ~@(flatten (map #(list (keyword %) %) keywords)))))
用法:
(macroexpand-1 '(make-get "/api/search" nick_name gender phone max_age min_age page lmt))
(user/GET "/api/search" [nick_name gender phone max_age min_age page lmt] (user/db-search-users :nick_name nick_name :gender gender :phone phone :max_age max_age :min_age min_age :page page :lmt lmt))
我想你用的是Compojure?您不需要对参数映射进行分解(Compojure中的向量是
{:keys[…]}
-类似于参数映射上的分解),您只需将其传递给函数:
;; you can use a map to destructure the entire request map
(GET "/api/search" {:keys [params]}
(db-search-users (select-keys params [:nick_name ...])))
选择关键点
是可选的,但如果没有它,您的功能可能会在地图中接收到意外的关键点
您可能需要考虑验证<代码> PARAMS <代码>——可能将某些值强制为更有用的类型——然后将它们传递给<代码> DB搜索用户< /C>。请参阅Prismatic's以获得一个很好的方法。
(defmacro make get[path&keywords]`(get~path[~@keywords](db search users~@(mapcat(juxt关键字标识)keywords)))
是否可以编写一个可以将关键字转换为地图的宏?这个宏很适合这个问题。但不能用于其他函数,因为其中有“db搜索用户”。@user2219372。。。使函数成为宏的参数:(defn make get[f path&keywords]`(get~path[~@keywords](~f~@(mapcat(juxt关键字标识)keywords)))这正是我想要的。