答案 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
。