Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一些方法可以避免clojure中的这种重复代码?_Clojure - Fatal编程技术网

有没有一些方法可以避免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)))这正是我想要的。