2012-10-19 10 views
8

में एक अनुक्रम के रूप में जावा क्लास कार्य करें I जावा क्लास का उपयोग कर रहा हूं जो परिणामों के अनुक्रम का प्रतिनिधित्व करता है (कुछ हद तक क्लोजर वेक्टर की तरह)।क्लोजर

मैं (यानी मैं कक्षा व्यवहार करना चाहते हैं जैसे कि वह अनुक्रम अमूर्त समर्थित) ठेठ Clojure अनुक्रम कार्यों के साथ इस वर्ग का उपयोग करने के तथापि मैं वर्ग तो यह सुनिश्चित करने के लिए असमर्थ हूँ नहीं बदल सकते हैं चाहते हैं clojure.lang.Seqable या इसी तरह लागू करें। इसके अलावा, कष्टप्रद, कक्षा java.util.Collection या java.lang.Iterable लागू नहीं करती है।

  • उपयोग iterator-seq वस्तु की (मौजूदा) पुनरावर्तक पर:

    मैं कुछ ही विकल्प देख सकते हैं।

  • लपेटें अन्य वर्ग को लागू करता है कि java.util.Collection/clojure.lang.Sequable
  • एक समारोह है कि वस्तु

पूछताछ की एक Clojure वेक्टर या अनुक्रम बनाता बनाएं वहाँ किसी भी अन्य विकल्प हैं में वस्तु? सबसे अच्छा तरीका क्या है?

+1

'iterator-seq' ठीक प्रतीत होता है, आंतरिक रूप से यह ऑब्जेक्ट – Ankur

उत्तर

6

सबसे तेज़ और सबसे सरल iterator-seq का उपयोग करना होगा।

यह सवाल पूछता है: कोर क्लोजर क्यों सीकसोर्स जैसे प्रोटोकॉल प्रदान नहीं करता है जिसे seq द्वारा बुलाया जाएगा। फिर गैर-मानक संग्रह को एक सीक की आपूर्ति के लिए "विस्तारित" किया जा सकता है, इसी प्रकार आंतरिक रेडुस reduce के लिए कैसे काम करता है।

+7

को लपेटने के बारे में आपके दूसरे बिंदु के समान ही होता है क्योंकि seq (ए) कंपाइलर द्वारा उपयोग किया जाता है, और इस प्रकार जावा-अनुकूल (यानी एक इंटरफ़ेस), और (बी) भी बहुत बार कहा जाता है, ताकि इसे यथासंभव तेज़ होना चाहिए - प्रोटोकॉल बहुत सी चीजों से तेज़ होते हैं, लेकिन एक साधारण इंटरफ़ेस प्रेषण जितना तेज़ नहीं होता है। – amalloy

+0

@amalloy तो शायद –

+0

के बजाय 'to-seq' फ़ंक्शन "भी, कष्टप्रद, कक्षा java.util.Collection या java.lang.Iterable लागू नहीं करती है।" – noahlz

2

मेरा पहला शॉट उस वस्तु की आलसी-seq बनाने के लिए किया जाएगा बनाने के लिए:

(defn sequify [obj] 
    (letfn [(inner [idx] 
       (when (< idx (.size obj)) 
          (cons (.get obj idx) 
           (lazy-seq 
            (inner (inc idx))))))] 
    (inner 0))) 

बस उचित तरीकों के साथ .size और .get बदलें।

यदि आप lazy-seq समाधान की तुलना में प्रदर्शन में सुधार करना चाहते हैं तो एक रैपर लिखना अधिक उपयुक्त हो सकता है।