2016-11-02 23 views
1

解構的地圖,例如與{:keys [x y]} m,不能在功能paramters時,有將要相同類型的許多地圖(比如m0m1)來完成。這樣做會導致xy被遮蔽。因此,不是,這是我做了點類型解構時有重複的關鍵字,

(defn intersection [point0 
        point1] 
    (let [x0 (:x point0) 
     y0 (:y point0) 
     x1 (:x point1) 
     y1 (:y point1)])) 

什麼是實現上述的清潔劑(更地道)的方式?我希望有一個觀點,即始終擁有密鑰:x:y,而不是訴諸於第一個點,其中第:x0和第:y0,第二個具有:x1:y1

相同 =「輸入一致的名稱映射」

回答

4

如果我假設你要求在輸入地圖中有一致的名稱,那麼每個點都有鍵:x和:y:那麼你可以n使用其它語法在地圖解構:

{name key-to-use ...} 

:keys形式對於這種形式的快捷方式。

如果點作爲自己的參數傳遞:

user> (def p1 {:x 0 :y 1}) 
#'user/p1 
user> (def p2 {:x -3 :y -8}) 
#'user/p2 

user> (defn example [{x0 :x y0 :y} {x1 :x y1 :y}] 
     [x0 x1 y0 y1]) 
#'user/example 
user> (example p1 p2) 
[0 -3 1 -8] 

如果您傳遞點,那麼你可以嵌套地圖和列表解構

user> (defn example [[{x0 :x y0 :y} {x1 :x y1 :y}]] 
     [x0 x1 y0 y1]) 
#'user/example 
user> (example [p1 p2]) 
[0 -3 1 -8] 
+0

我不會把這個清單「備用「語法 - 它是基本的地圖解構語法,像':keys'這樣的東西被構建爲一個方便的層。 – amalloy

+0

這是真的,這是他使用的那個選擇。我會將其更改爲「其他語法」 –

2

您可以選擇哪些名稱被綁定到一個鍵:從Destructuring in Clojure

(let [{x1 :x y1 :y} m1 
     {x2 :x y2 :y} m2] 
    (foo x1 y1 x2 y2)) 

參見下面的例子:

(def my-map {:a "A" :b "B" :c 3 :d 4}) 
(let [{a :a, x :x, :or {x "Not found!"}, :as all} my-map] 
    (println "I got" a "from" all) 
    (println "Where is x?" x)) 
;= I got A from {:a "A" :b "B" :c 3 :d 4} 
;= Where is x? Not found!