为什么Clojure向量用于传递键值对?

为什么Clojure向量用于传递键值对?,clojure,clojurescript,Clojure,Clojurescript,作为Clojure的新手,向量(类似数组)和映射(键值对)之间的区别最初对我来说似乎很清楚 然而,在很多情况下(例如“let”特殊形式和带有关键字参数的函数),向量用于传递键值对 偶数包括一个检查,以确保向量包含偶数个元素 我真的不明白为什么用矢量代替地图。当我阅读有关集合类型的内容时,我希望映射是以键值格式存储任何信息的首选方式 有人能解释为什么向量似乎也是表示成对键和值的首选工具吗?Clojure IRC频道的优秀人员向我解释了主要原因:地图(散列)没有排序 例如,let形式允许在参数顺序不

作为Clojure的新手,向量(类似数组)和映射(键值对)之间的区别最初对我来说似乎很清楚

然而,在很多情况下(例如“let”特殊形式和带有关键字参数的函数),向量用于传递键值对

偶数包括一个检查,以确保向量包含偶数个元素

我真的不明白为什么用矢量代替地图。当我阅读有关集合类型的内容时,我希望映射是以键值格式存储任何信息的首选方式


有人能解释为什么向量似乎也是表示成对键和值的首选工具吗?

Clojure IRC频道的优秀人员向我解释了主要原因:地图(散列)没有排序

例如,let形式允许在参数顺序不稳定时可能中断的反向引用:

(let [a 1 b (inc a)] (+ a b))
不使用有序映射的原因

  • 它们没有方便的文字
  • 香草Clojure没有有序地图 除了一个按排序键排序的(这会很奇怪)

  • 因此,保持参数有序的需要压倒了它们是键值对这一事实。

    重新绑定是合法的,并且还强加了顺序:
    (让[a1,a2]a)
    产生
    2
    。即使是
    ((fn[a]a)3 4)
    也是合法的,产生
    4
    。这并不能解释为什么使用向量而不是列表。我想,因为列表会触发对第一个参数的求值,所以人们必须引用它们。我看到的一个优点是,可以进行计数,因此可以测试参数的奇偶性。如果它是一个列表,那么在知道缺少一个列表之前,您应该传递整个列表并评估本地绑定。在CL中,绑定在括号之间,因此没有歧义,但let的参数是可变的,在Clojure中,不可变的NIL参数将是压倒性的;)