为什么clojure中的这么多函数对列表和向量有不同的行为以及如何改变它?

时间:2013-06-25 06:53:28

标签: clojure

在clojure中,你有几个函数对vector和list有不同的作用。我有两个问题。

1)它有什么用? 我相信clojure的创造者有很好的理由这样做,但我不知道。

2)无论数据在列表或向量中,如何使那些函数的类型安全变体以相同的方式运行?

定义的函数conj具有以下行为

(conj [1 2 3] 4)
[1 2 3 4]

(conj '(1 2 3) 4)
(4 1 2 3)

我想要一个具有以下行为的函数my-conj

(my-conj [1 2 3] 4)
[1 2 3 4]

(my-conj '(1 2 3) 4)
(1 2 3 4)

还有其他功能(cons,into,peek,pop)具有相同的行为,所以如果这种结构可以很容易地适应所有这些,那将会很好。

2 个答案:

答案 0 :(得分:9)

由于数据结构的实现方式,使它们的行为略有不同是更有效的。例如,很容易在列表的开头添加项目(概念上只是将项目链接到现有列表的开头),但很难在向量的开头添加项目(概念上将现有项目移动到指数),反之亦然。

替代方案将是一致的,但最坏情况复杂度要差得多。

(请参阅http://www.innoq.com/blog/st/2010/04/clojure_performance_guarantees.html了解绩效保证表)

答案 1 :(得分:3)

从表面上看,我理解这看起来有多奇怪,但我认为这个想法是,conj做了默认的,最简单的“为这个集合添加一个元素”动作。矢量和列表的构建方式不同,需要不同类型的默认操作。