2011-09-29 25 views
7

यह मुझे थोड़ी देर के लिए परेशान कर रहा है, हमें लूप में किसी सेट या मानचित्र में मूल्य कैसे स्टोर करना चाहिए?लूप के लिए क्लोजर, सेट को सेट या मानचित्र में

(let [s #{}] 
    (for [ i (range 10) 
      j (range 10) ] 
     (into s [i j]))) 

मुझे पता है यह काम नहीं करेगा, लेकिन मैं एक कार्यक्षमता इस के समान है, जहां सेट अंत में शामिल होंगे चाहते [0 0] [0 1] ... [0 9] [1 0] .. । [9 9]

धन्यवाद

+0

प्रतिक्रियाओं के लिए सभी धन्यवाद। – KaKa

उत्तर

13

अगर मैं आपके सवाल का सही ढंग से समझ है कि आप अपने अभिव्यक्ति चालू करने की आवश्यकता के अंदर-आउट:

(let [s #{}] 
    (into s (for [i (range 10) 
       j (range 10)] 
      [i j]))) 

बात यहाँ है महसूस करने के लिए कि for जावा और सी

0

clojure परिवर्तनशील राज्य के प्रबंधन के लिए एक कई महान प्रणाली है। इस मामले में आप चाहते हैं एक atom एक सेट से युक्त हो सकता है

अपने अन्य विकल्प हैं:

  • एक ref यदि एक से अधिक परिवर्तन (कई धागे समन्वित)
  • एक var अगर यह हो जाएगा बनाया करने की जरूरत है एकल थ्रेड (एक वर बस के रूप में अच्छी तरह से यहाँ एक परमाणु के रूप में काम कर सकते हैं)
  • एक agent अगर आप
एसिंक्रोनस रूप से मूल्य निर्धारित करने के लिए करना चाहता था

पाठ्यक्रम for एक दृश्य देता है पहले से ही ऐसा तुम सिर्फ चाहते हो सकता है

(into #{} (for [ i (range 10) 
        j (range 10) ] 
      [i j])) 
+0

यहां पहला कोड स्निपेट कोई समझ नहीं आता है, जहां तक ​​मैं कह सकता हूं? यह 'स्वैप!' का उपयोग करने का एक वैध तरीका नहीं है, और जैसा कि आपने बाद में उल्लेख किया है कि यह वैसे भी एक अच्छा विचार नहीं है। – amalloy

+0

पहला स्निपिट वास्तव में उत्तर का बिंदु नहीं था इसलिए मैंने इसे अभी हटा दिया। आउट परीक्षण के साथ प्रस्तुत * जोखिम जोखिम * –

6

जैसी अधिक अनिवार्य भाषाओं में फॉर-लूप के विपरीत एक मान (आलसी अनुक्रम) देता है, क्या यह आप चाहते हैं?

(into #{} (for [i (range 10) j (range 10)] 
    [i j])) 
;-> #{[2 1] [3 2] [4 3] [5 4] [6 5] [7 6] [8 7] [9 8] [1 0] 
;  [2 2] [3 3] [4 4] [5 5] [6 6]... 

और तुम सिर्फ एक सेट के रूप में सूची चाहते हैं:

(set (for [i (range 10) j (range 10)] 
    [i j]))  

आप जोड़ों का एक समूह के साथ खत्म हो जाएगा।

5

आम तौर पर आप loop/recur से एक सेट या एक नक्शा या अन्य 'एकल मान' है कि एक seq पर एक 'बार-बार' सामान्यीकृत आपरेशन से एक seq नहीं है वापस जाने के लिए, का उपयोग कर reduce अधिक मुहावरेदार है/सरल चाहते हैं, और for हमेशा एक सीक (एक सेट या मानचित्र नहीं) देता है।

(reduce conj #{} (for [i (range 10) j (range 10)] [i j])) 

ध्यान दें कि (के लिए ..) यहाँ केवल एक seq सभी मूल्यों से युक्त एकल परिणाम सेट में संकलित करने के लिए उत्पादन किया जाता है। या, उदाहरण के लिए:

(reduce + 0 (range 100)) 
=> 4950 
0

मुझे लगता है कि आप इस परिदृश्य में कुछ क्षणिक डेटा संरचना का भी उपयोग कर सकते हैं।

(let [s (transient #{})] 
(for [ i (range 10) 
     j (range 10) ] 
    (assoc! s i j))) 
(persistent! s) 

बस एक कोड नमूना, परीक्षण नहीं किया गया।

+1

यह सही नहीं है। [ट्रांजिस्टर के लिए दस्तावेज़] (http://clojure.org/transients): "विशेष रूप से ध्यान दें कि ट्रांजिस्टर को जगह में डालने के लिए डिज़ाइन नहीं किया गया है। आपको अगली कॉल में रिटर्न वैल्यू कैप्चर और उपयोग करना होगा। इसमें वैसे, वे समान कोड संरचना का समर्थन करते हैं क्योंकि वे कार्यात्मक निरंतर कोड को प्रतिस्थापित करते हैं "। – Jonas

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

  • कोई संबंधित समस्या नहीं^_^