2016-04-20 37 views

回答

8

另外,如果你需要实现全收集,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

4

是的,懒惰以及drop-last也可以采取n这一事实,表明有多少元素从末端懒惰地放下。

有一个讨论here那里有人正在使情况butlast是更具可读性和Lisp的程序员也许熟悉的成语,但我通常选择使用drop-last