2014-02-18 18 views
4

原谅我的新问题和潜在的错误术语。为什么Clojure矢量函数的结果不包括停止值?

Clojure矢量函数产生的值不包含停止值。例如:

=> (subvec [:peanut :butter :and :jelly] 1 3) 
[:butter :and] 
=> (range 1 5) 
(1 2 3 4) 

的文档的范围明确指出这一点,但没有给出一个合理的:“......返回从开始(含)至结束(独家)NUMS的懒惰序列...”。

在Ruby这些操作包括:

(1..5).to_a => [1,2,3,4,5] [:花生,:黄油,:和, :果冻] [1,3] => [:黄油,:和:果冻]

显然,这些都是非常不同的语言,但我想知道,如果有一些深层的原因,除了个人喜好由语言设计师?

+0

这里没有太多的答案。 Clojure使用独家终端索引,Ruby使用包容性。支持他们两人保持一致。独占与包容并无多大争议。你可能会认为包容性更“直观”,但这取决于你与谁交谈。 – Linuxios

+1

在Ruby中,'1..5'包含5,​​但'1 ... 5'不包含。 Ruby能够做到这一点。 – Chuck

回答

5

使得最终独家允许你做的事情一样指定(count collection)的端点,而无需得到一个NPE。这是两种方法最大的区别。

+2

另外它意味着'(range x y)'将是一个长度为(( - y x)'的集合)。这通常比'(+ 1( - y x))'方便,并且java的String方法行为相似。事实上,这是clojure的行为方式的另一个非常重要的原因:clojure集合满足java集合接口,它使用包容/独占方案。 – amalloy

4

这可能是索引是为了与Java库一致选择。 java.lang.String.substringjava.util.List.subList都有独占终端索引。

相关问题