2010-12-16 9 views
6

मैं प्रैक्टिकल क्लोजर (अध्याय 5) में पढ़ रहा था कि rseq फ़ंक्शन ऑपरेशन निरंतर समय में निष्पादित होता है। ऐसा लगता है कि यह एक रैखिक समय ऑपरेशन होना चाहिए। क्या कोई मेरे लिए इस पर कुछ प्रकाश डाल सकता है?कॉन्स्टेंट समय में क्लोजर आरएसईसी?

उत्तर

12

इस प्रयास करें:

(class [1 2 3 4])

आप देखेंगे:

clojure.lang.PersistentVector

अब इस प्रयास करें:

(class (rseq [1 2 3 4]))

और अनुक्रम इम्प lementation अलग है:

clojure.lang.APersistentVector$RSeq

के रूप में रोमन ने कहा, यह एक दृश्य के लिए एक भिन्न इंटरफेस है। सभी तत्व वे हैं जहां वे आप एक रिवर्स ऑर्डर में बस पहुंच रहे थे।

आप देखना चाहते हैं कि इसे यहाँ लागू हो जाता है RSeq वर्ग देख सकते हैं: https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

+0

बहुत बहुत धन्यवाद! यह समझ आता है। –

3

मुझे नहीं पता कि यह कैसे कार्यान्वित किया गया है, लेकिन मुझे लगता है कि यह केवल कुछ ऑब्जेक्ट देता है जो अनुक्रम इंटरफ़ेस लागू करता है और जानता है कि रिवर्स ऑर्डर में संरचना (वेक्टर या क्रमबद्ध मानचित्र) को कैसे पार किया जाए। परिणाम अनुक्रम आलसी है, इसलिए इसे तुरंत पूरी संरचना को पार करने की आवश्यकता नहीं है।

0

यह लगातार समय में नए इंटरफ़ेस रिटर्न की तरह गोरान Jovic कहा लेकिन यह मुद्रण बाहर रैखिक है। तो इसे आरईपीएल में प्रदर्शित करना रैखिक है, लेकिन इसे डीफ़ में डालना निरंतर है।

संबंधित मुद्दे