通过使用其键和值调用函数来创建嵌套的Clojure映射



我遇到问题。所以问题是。

  • 我有这样的地图这样的 {:first {"value1" "value2" "value3"...} :second {"value1" "value2" "value3"...}....}
  • 我有一个功能用参数(first&value1)向服务器提出请求并返回一些信息(必须使用每个键及其请求值(first&value1, first&value2 ...second&value1...)(
  • 下一步是生成新地图,例如:

    {:first 
      {:value1 
        {subvalue1, subvalue2 ..} 
       :value2 
        {subvalue2-1,subvalue2-2}}    
     :second
      {:value3 
        {:subvalue3-1,:subvalue3-2}..}..}
    

子值是对每个键及其价值的每个项目提出请求的结果。而且我想再次重复该操作(当我向服务器提出请求时使用3个参数(以获得4次嵌套地图:{first {second {third {fourth}}}}。也许有人给我有用的建议如何做。

此功能有点漫长,但要做的是要做的事情:

(defn rec-update
  [m f]
  (let [g (fn g [m args]
            (into {}
                  (for [[k v] m]
                    (if (instance? java.util.Map v)
                      [k (g v (conj args (name k)))]
                      [k (into {} (map #(let [args (into args [(name k) (name %)])]
                                          [(keyword %) (f args)])
                                       v))]))))]
    (g m [])))

f参数应是获取参数集合并返回结果向量的函数。这是选择随机数量随机响应的样本:

(defn make-request
  [params]
  (vec (repeatedly (+ 1 (rand-int 3)) #(rand-nth ["r1" "r2" "r3"]))))

尽管以下示例未证明,但给出此功能的params确实是嵌套值直至该点。

使用:

(def m {:first ["val1" "val2" "val3"], :second ["val4" "val5"]})
(rec-update m make-request)
=>
{:first {:val1 ["r2" "r2" "r3"], :val2 ["r2" "r2"], :val3 ["r1" "r3"]},
 :second {:val4 ["r3" "r3"], :val5 ["r2" "r1"]}}

在结果上再次运行:

(rec-update *1 make-request)
=>
{:first {:val1 {:r2 ["r1" "r3" "r2"], :r3 ["r3" "r2"]},
         :val2 {:r2 ["r1" "r1"]},
         :val3 {:r1 ["r2"], :r3 ["r1" "r2" "r3"]}},
 :second {:val4 {:r3 ["r3" "r2"]}, :val5 {:r2 ["r1"], :r1 ["r2" "r3"]}}}

您可以看到,从请求返回的任何重复值只能在结果映射中表示一次。

最新更新