2016-04-20 5 views

उत्तर

8

भी, अगर आप पूरे संग्रह का एहसास करने की जरूरत है, butlast नाटकीय रूप से तेजी से है, जो तार्किक है अगर आप अपने स्रोत को देखो है। यहां एक छोटा सा उदाहरण दिया गया है:

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-lastn भी ले सकता है, यह दर्शाता है कि कितने तत्व आलसी से गिरने के लिए छोड़ते हैं।

वहाँ एक चर्चा here जहां किसी कि butlast अधिक पठनीय और लिस्प प्रोग्रामर के लिए शायद एक परिचित मुहावरा है मामले बना रही है, लेकिन मैं आम तौर पर सिर्फ drop-last उपयोग करने के लिए चुनते हैं।

(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, जबकि butlastrecur के साथ सरल यात्रा का उपयोग करता है: