重复关键字

时间:2016-11-02 23:06:41

标签: clojure

当有许多相同类型的地图(比如{:keys [x y]} mm0)时,无法在功能参数中完成解析地图,例如使用m1 。这样做会导致xy被遮蔽。所以这就是我为点 type

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

实现上述目标的更清洁(更惯用)的方法是什么?我想要一个点始终拥有密钥:x:y,而不是诉诸第一个拥有密钥:x0:y0的点,第二个拥有:x1 }和:y1

相同的类型 =“输入映射中的一致名称”

2 个答案:

答案 0 :(得分:4)

如果我假设您要求在输入映射中使用一致的名称,那么每个点都有键:x和:y:那么您可以使用其他语法进行映射解构:

int → boolean

{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]

答案 1 :(得分:2)

您可以选择与键绑定的名称:

Foo

另请参阅Destructuring in Clojure中的以下示例:

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