为什么Clojure向量函数结果会排除停止值?

All*_*ate 4 vector clojure

原谅我提出新问题和可能不正确的术语.

Clojure向量函数生成不包含停止值的值.例如:

=> (subvec [:peanut :butter :and :jelly] 1 3)
[:butter :and]
=> (range 1 5)
(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

范围的doc明确地说明了这一点,但没有给出理性:"......从开始(包括)到结束(独占)......返回一个懒惰的num seq.".

在Ruby中,这些操作是包容性的:

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

显然这些是非常不同的语言,但我想知道是否有一些潜在的原因,除了语言设计者的个人偏好?

Chu*_*uck 5

使结束独占允许您(count collection)在不获取NPE的情况下执行指定为端点的操作.这是两种方法之间最大的区别.

  • 它也意味着`(范围xy)`将是一个长度为`( - yx)`的集合.这通常比`(+ 1( - yx))`更方便,而java的String方法表现相似.事实上,这是clojure行为方式的另一个非常重要的原因:clojure集合满足java集合接口,它使用包容性/排他性方案. (2认同)