为什么Clojure向量用于传递键值对?
作为Clojure的新手,向量(类似数组)和映射(键值对)之间的区别最初对我来说似乎很清楚 然而,在很多情况下(例如“let”特殊形式和带有关键字参数的函数),向量用于传递键值对 偶数包括一个检查,以确保向量包含偶数个元素 我真的不明白为什么用矢量代替地图。当我阅读有关集合类型的内容时,我希望映射是以键值格式存储任何信息的首选方式为什么Clojure向量用于传递键值对?,clojure,clojurescript,Clojure,Clojurescript,作为Clojure的新手,向量(类似数组)和映射(键值对)之间的区别最初对我来说似乎很清楚 然而,在很多情况下(例如“let”特殊形式和带有关键字参数的函数),向量用于传递键值对 偶数包括一个检查,以确保向量包含偶数个元素 我真的不明白为什么用矢量代替地图。当我阅读有关集合类型的内容时,我希望映射是以键值格式存储任何信息的首选方式 有人能解释为什么向量似乎也是表示成对键和值的首选工具吗?Clojure IRC频道的优秀人员向我解释了主要原因:地图(散列)没有排序 例如,let形式允许在参数顺序不
有人能解释为什么向量似乎也是表示成对键和值的首选工具吗?Clojure IRC频道的优秀人员向我解释了主要原因:地图(散列)没有排序 例如,let形式允许在参数顺序不稳定时可能中断的反向引用:
(let [a 1 b (inc a)] (+ a b))
不使用有序映射的原因
因此,保持参数有序的需要压倒了它们是键值对这一事实。重新绑定是合法的,并且还强加了顺序:
(让[a1,a2]a)
产生2
。即使是((fn[a]a)3 4)
也是合法的,产生4
。这并不能解释为什么使用向量而不是列表。我想,因为列表会触发对第一个参数的求值,所以人们必须引用它们。我看到的一个优点是,可以进行计数,因此可以测试参数的奇偶性。如果它是一个列表,那么在知道缺少一个列表之前,您应该传递整个列表并评估本地绑定。在CL中,绑定在括号之间,因此没有歧义,但let的参数是可变的,在Clojure中,不可变的NIL参数将是压倒性的;)