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

3
作为Clojure的新手,一开始我认为向量(类似于数组)和映射(键值对)之间的区别很清楚。但是在许多情况下(例如“let”特殊形式和带有关键字参数的函数),向量用于传递键值对。 Let的源代码甚至包括一个检查以确保向量包含偶数个元素。我真的不明白为什么要使用向量而不是映射。当我阅读关于集合类型的内容时,我会期望映射是存储任何以键值格式表示的信息的首选方式。是否可以有人解释一下为什么向量也似乎是表达键和值对的首选工具?
1个回答

5

亲爱的用户,您好!以下是您需要翻译的内容:

非常友好的Clojure IRC频道上的人向我解释了主要原因:映射(hashes)不是有序的

例如,let表达式允许反向引用,如果参数顺序不稳定可能会导致错误:

(let [a 1 b (inc a)] (+ a b))

有序映射不被使用的原因:

  1. 它们没有方便的字面量
  2. 普通的Clojure没有有序映射,除了一个通过对键进行排序而有序的映射(这很奇怪)。

因此,保持参数顺序的需求胜过它们是键值对的事实。


1
重新绑定是合法的,也会强制执行顺序:(let [a 1, a 2] a) 将产生 2。即使 ((fn [a a] a) 3 4) 也是合法的,结果为 4 - Thumbnail
这并没有解释为什么要使用向量而不是列表。 - DaoWen
我猜是因为列表会触发第一个参数的评估,所以人们必须对它们进行引用? - VincentDM
1
我认为一个好处是你可以计数并测试参数的奇偶性。如果这是一个列表,你需要传递整个列表并在知道缺失项之前评估本地绑定。在CL中,绑定在括号之间,所以没有歧义,但let的参数是可变的,在Clojure中,不可变的NIL参数将是压倒性的 ;) - Ivan Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接