Clojure中的拼接

时间:2012-07-23 07:25:17

标签: clojure

是否有一个函数可以在序列中获取“从x到y”的项目?

例如,给定(range 10)我想要[5 6 7 8](从第6到第9,或从第6开始拿4)。当然,我可以通过几个函数(例如(take 4 (drop 5 (range 10))))的组合来实现这一点,但似乎很奇怪,没有像pythons mylist[5:9]这样的内置函数。感谢

3 个答案:

答案 0 :(得分:6)

对于向量,

subvec,主要是因为它是O(1)。对于seqs,您需要使用O / n of take / drop。

答案 1 :(得分:1)

从哲学的角度来看,没有内置运算符的原因是你不需要内置的运算符来让它感觉像在Python中那样“自然”。

(defn splice [coll start stop]
  (take (- stop start) (drop start coll)))

(splice coll 6 10)

感觉就像内置语言一样,具有与任何功能一样多的“新语法”。在Python中,特殊的[x:y]运算符需要语言级支持才能使其感觉像单元素访问器一样自然。

因此,Clojure不会让(已经拥挤的)语言核心变得混乱,只是为用户或库留出了空间,以便在需要时实现此目的。

答案 2 :(得分:0)

(range 5 9)(vec (range 5 9))

(也许这个range的语法在2012年中期无法使用。)