2010-10-25 13 views
13

है तो सूची है ?, seq ?, वेक्टर ?, मानचित्र? और यह निर्धारित करने के लिए कि तर्क किस प्रकार का संग्रह है।क्लोजर: पता लगाना कि संग्रह seq-able

क्या

  • एक नक्शे के बीच का अंतर (यानी कुछ है कि कुंजी-मान जोड़ों शामिल हैं)
  • एक संग्रह (यानी कुछ है कि मान)
  • एक गैर संग्रह मूल्य बताने का एक अच्छा तरीका है एक स्ट्रिंग की तरह।

वहाँ से

#(or (seq? %) (list? %) etc) 

उत्तर

9

का उपयोग कर seq? के बारे में के रूप में संक्षिप्त और साफ के रूप में यह हो जाता है है एक बेहतर तरीका है।

clojure.contrib.core परिभाषित करता है:

 
seqable? 
    function 
    Usage: (seqable? x) 
    Returns true if (seq x) will succeed, false otherwise. 

http://clojure.github.com/clojure-contrib/core-api.html

यह क्या आप

  • पहले से ही से एक बड़ा or बयान एक seq
  • का एक उदाहरण के साथ प्रस्तावित करता है clojure.lang.Seqable
  • Iterable के 10
  • शून्य
  • उदाहरण
  • एक सरणी
  • एक स्ट्रिंग java.util.Map
+0

@kotarak लिंक को ठीक करने के लिए धन्यवाद :) –

+0

मेरा मानना ​​है कि यह स्थानांतरित हो गया है ... यह कहां है? – jayunit100

+0

क्लोजर (1.5) के मौजूदा संस्करण में seqable? वर्तमान में clojure.core.incubator में रह रहा है (रेपो @ https://github.com/clojure/core.incubator) –

4

समारोह seq अभी की

  • उदाहरण केवल इस करता है:

    (. clojure.lang.RT (seq coll)) 
    

    क्लोजर के नवीनतम संस्करण में RT.java में, आप पाएंगे:

    static public ISeq seq(Object coll){ 
        if(coll instanceof ASeq) 
         return (ASeq) coll; 
        else if(coll instanceof LazySeq) 
         return ((LazySeq) coll).seq(); 
        else 
         return seqFrom(coll); 
    } 
    
    static ISeq seqFrom(Object coll){ 
        if(coll instanceof Seqable) 
         return ((Seqable) coll).seq(); 
        else if(coll == null) 
         return null; 
        else if(coll instanceof Iterable) 
         return IteratorSeq.create(((Iterable) coll).iterator()); 
        else if(coll.getClass().isArray()) 
         return ArraySeq.createFromObject(coll); 
        else if(coll instanceof CharSequence) 
         return StringSeq.create((CharSequence) coll); 
        else if(coll instanceof Map) 
         return seq(((Map) coll).entrySet()); 
        else { 
         Class c = coll.getClass(); 
         Class sc = c.getSuperclass(); 
         throw new IllegalArgumentException("Don't know how to create ISeq from: " + c.getName()); 
        } 
    } 
    

    एक ASeq या LazySeq पहले से ही एक सीक है। एक Seqable ऐसा कुछ है जो जानता है कि खुद को एक सीईसी कैसे वापस करनी है।

    जो जावा कोर क्लास जैसे चीजों को छोड़ देता है, जिसे सीक्वेबल होना चाहिए, लेकिन क्लोजर seq विधि जोड़ने में बदलाव नहीं कर सकता है। वर्तमान में वे इस सूची में हार्ड-कोड किए गए हैं। अगर किसी दिन कार्यान्वयन में बदलाव आया तो शायद मुझे आश्चर्य नहीं होगा, शायद इसके बजाय जावा कोर कक्षाओं को विस्तारित करने के लिए प्रोटोकॉल का उपयोग करना?

  • 4

    हमें यह नहीं भूलना नहीं sequential? के बारे में:

    user=> (sequential? []) 
    true 
    user=> (sequential? '()) 
    true 
    user=> (sequential? {:a 1}) 
    false 
    user=> (sequential? "asdf") 
    false 
    
    0

    सभी seqables clojure.lang.Seqable मार्कर लागू:

    (instance? clojure.lang.Seqable x) 
    

    Clojure 1।9 seqable?

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