2016-04-20 53 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