【问题标题】:Why are Clojure vectors used to pass key-value pairs?为什么 Clojure 向量用于传递键值对?
【发布时间】:2016-07-14 02:05:49
【问题描述】:

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

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

The source code for let 甚至包括一个检查以确保向量包含偶数个元素。

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

谁能解释一下为什么向量似乎也是表达键和值对的首选工具?

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    Clojure IRC 频道的好人向我解释了主要原因:地图(哈希)没有排序

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

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

    没有使用有序地图的原因

    1. 他们没有方便的文字
    2. vanilla Clojure 没有有序映射 除了按排序键排序的那个(这很奇怪)。

    因此,保持参数有序的需要胜过它们是键值对这一事实。

    【讨论】:

    • 重新绑定是合法的,并且还强制执行命令:(let [a 1, a 2] a) 产生 2。即使((fn [a a] a) 3 4) 也是合法的,产生4
    • 这并不能解释为什么使用向量而不是列表。
    • 我猜是因为列表会触发对第一个参数的评估,所以人们必须引用它们?
    • 我看到的一个优点是您可以进行计数,因此可以测试参数的奇偶性。如果它是一个列表,您应该在知道缺少一个列表之前传递整个列表并评估本地绑定。在 CL 中,绑定在括号之间,因此没有歧义,但 let 的参数是可变的,在 Clojure 中,不可变的 NIL 参数将是压倒性的;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多