【发布时间】:2012-07-23 07:25:17
【问题描述】:
是否有一个函数可以按顺序获取“从 x 到 y”的项目?
例如,给定(range 10),我想要 [5 6 7 8](从第 6 位取到第 9 位,或者从第 6 位取 4,)。当然,我可以结合几个函数(例如(take 4 (drop 5 (range 10))))来实现它,但似乎很奇怪没有像pythons 的mylist[5:9] 这样的内置函数。谢谢
【问题讨论】:
标签: clojure
是否有一个函数可以按顺序获取“从 x 到 y”的项目?
例如,给定(range 10),我想要 [5 6 7 8](从第 6 位取到第 9 位,或者从第 6 位取 4,)。当然,我可以结合几个函数(例如(take 4 (drop 5 (range 10))))来实现它,但似乎很奇怪没有像pythons 的mylist[5:9] 这样的内置函数。谢谢
【问题讨论】:
标签: clojure
subvec 用于向量,主要是因为它是 O(1)。对于 seq,您需要使用 take/drop 的 O(n)。
【讨论】:
从哲学的角度来看,没有内置运算符的原因是您不需要内置运算符来让它感觉像在 Python 中那样“自然”。
(defn splice [coll start stop]
(take (- stop start) (drop start coll)))
(splice coll 6 10)
感觉就像是一种内置语言,具有与任何功能一样多的“新语法”。在 Python 中,特殊的 [x:y] 运算符需要语言级别的支持才能使其与单元素访问器一样自然。
因此,Clojure 不会弄乱(已经很拥挤的)语言核心,而是简单地为用户或库留出空间来实现这一点。
【讨论】:
(range 5 9),或(vec (range 5 9))。
(也许range 的这种语法在 2012 年年中不可用。)
【讨论】: