Clojure butlast vs drop-last

时间:2016-04-20 05:01:20

标签: clojure clojurescript

Clojure中butlastdrop-last之间有什么区别?

只是懒惰吗?我应该更喜欢一个而不是另一个吗?

2 个答案:

答案 0 :(得分:9)

另外,如果您需要实现整个集合,butlast速度要快得多,如果您查看其来源,这是合乎逻辑的:

(def 
 butlast (fn ^:static butlast [s]
           (loop [ret [] s s]
             (if (next s)
               (recur (conj ret (first s)) (next s))
               (seq ret)))))

(defn drop-last
  ([s] (drop-last 1 s))
  ([n s] (map (fn [x _] x) s (drop n s))))

因此drop-last使用map,而butlast使用recur进行简单迭代。这是一个小例子:

user> (time (let [_ (butlast (range 10000000))]))
"Elapsed time: 2052.853726 msecs"
nil

user> (time (let [_ (doall (drop-last (range 10000000)))]))
"Elapsed time: 14072.259077 msecs"
nil

所以我不会盲目地偏爱一个而不是另一个。我只在我真的需要懒惰时使用drop-last,否则butlast

答案 1 :(得分:4)

是的,懒惰以及drop-last可以采取n的事实,表明从懒惰中删除了多少元素。

有一个讨论here,有人提出butlast更易读,也许是Lisp程序员熟悉的习惯用法,但我通常只选择使用drop-last