Clojure butlast vs drop last

Clojure butlast vs drop last,clojure,clojurescript,Clojure,Clojurescript,和在Clojure中有什么区别 只是懒惰吗?我应该选择其中一个而不是另一个吗?是的,懒惰以及最后一次删除也可以使用n,表示从最后一次删除多少元素 在一次讨论中,有人提出,butlast更具可读性,可能是Lisp程序员熟悉的习惯用法,但我通常只选择使用drop last此外,如果需要实现整个集合,butlast的速度要快得多,如果您查看它们的来源,这是合乎逻辑的: (def butlast (fn ^:static butlast [s] (loop [ret [] s

和在Clojure中有什么区别


只是懒惰吗?我应该选择其中一个而不是另一个吗?

是的,懒惰以及
最后一次删除
也可以使用
n
,表示从最后一次删除多少元素


在一次讨论中,有人提出,
butlast
更具可读性,可能是Lisp程序员熟悉的习惯用法,但我通常只选择使用
drop last

此外,如果需要实现整个集合,
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