क्लोजर (वास्तव में क्लोजरस्क्रिप्ट) में निम्नलिखित को पूरा करने का सबसे अच्छा तरीका क्या है:

  • तत्वों का एक परिवर्तनीय संग्रह xs, प्रत्येक प्रकार T (T एक नक्शा है, अगर हम विशिष्ट होना चाहते हैं)
  • उनमें से एक "चयनित तत्व", x, जो विभिन्न xs या "कोई नहीं चयनित" स्थिति के बीच वैकल्पिक होता है। चयनित वस्तुओं की संख्या या तो 1 या शून्य है।
  • xs और x में ईवेंट श्रोता उन्हें सुनेंगे: कुछ xs में किसी भी बदलाव को सुनते हैं; कुछ x में किसी भी बदलाव को सुनते हैं। (अर्थात, वे चयनित आइटम की स्थिति में एक अपडेट के लिए सुनते हैं, साथ ही साथ किस आइटम का चयन किया जाता है।) (मैं वास्तव में रिएक्ट के लिए रिएजेंट रैपर का उपयोग कर रहा हूं, इसलिए यह तब प्रभावित होता है जब घटक अपडेट होंगे। )
  • x को संपादित करने के तरीके (गैर-चयनित xs को संपादित करने की आवश्यकता नहीं है, हालांकि नया xs जोड़ने में सक्षम होने की आवश्यकता है)
  • xs में एक तत्व दिया गया है, इसे चुनने की एक विधि। (चुनिंदा "कोई नहीं" के मामले सहित)

मैंने अब तक जिन संभावनाओं के बारे में सोचा है:

  1. xs को एक ऐसा परमाणु बनाएं जो Ts का एक सदिश हो, और सुनिश्चित करें कि प्रत्येक T तत्व अपने स्वयं के सूचकांक को जानता है। x को x_idx से बदलें जो चयनित आइटम (या nil) की अनुक्रमणिका को संग्रहीत करता है। किसी तत्व का चयन करने का अर्थ केवल उसकी अनुक्रमणिका प्राप्त करना और x_idx को उस अनुक्रमणिका में बदलना है, जो दोनों निरंतर-समय के संचालन हैं। इसका नकारात्मक पक्ष यह है कि यह संरचना को थोड़ा कम सुरुचिपूर्ण और सरल बनाता है: मैं हमेशा चयनित आइटम के इंडेक्स के आसपास से गुजरता हूं, और हर ऑपरेशन जो मैं करना चाहता हूं, उसे इसके बजाय इंडेक्स के साथ काम करना पड़ता है वस्तु का ही, जैसा वह चाहता है। चूँकि मेरी T वस्तुएँ छोटी हैं, इसलिए केवल एक "चयनित वस्तु" चर होना अधिक सुखद होगा जो कि T प्रकार का है।
  2. xs को एक परमाणु वेक्टर और x को एक ऐसा परमाणु बनाएं जो T को स्टोर करे। अब x एक T है, जो अच्छा है, लेकिन जब मैं x के बारे में जानकारी अपडेट करना चाहता हूं, तो मुझे reset! या swap! पर दो कॉल करने होंगे। : एक x के लिए और एक xs में तत्व के लिए जो x दर्शाता है। स्पष्ट कारणों से सुरुचिपूर्ण। और मुझे इन्हें त्वरित उत्तराधिकार में करना होगा अन्यथा डेटा में एक असंगति होगी: दो कॉलों के बीच, xs सुनने वाले ईवेंट श्रोता एक राज्य में चयनित आइटम देखेंगे, और जो सुन रहे हैं x इसे दूसरे राज्य में देखेगा।
  3. T तत्वों को यह बताने के लिए एक फ़ील्ड दें कि वे चुने गए हैं या नहीं, और x से छुटकारा पाएं। यह सही होगा यदि एक साथ कई वस्तुओं का चयन किया जा सकता है, लेकिन चूंकि केवल एक आइटम का चयन किया जा सकता है, यह मुझे हर बार जब मैं चयनित आइटम चाहता हूं, तो मुझे एक रैखिक खोज करता है, जो बेकार है।

इस प्रश्न का मुद्दा किसी विशेष मुद्दे को हल करना नहीं है (उपरोक्त संभावनाओं में से कोई भी छोटी परियोजना के दायरे के लिए ठीक काम करता है), लेकिन क्लोजर डेटा संरचनाओं के बारे में जानने के लिए। यह एक सामान्य पर्याप्त स्थिति की तरह लगता है कि इसके चारों ओर कुछ संरचना होगी। "आपको पूरी तरह से एक अलग प्रश्न का उत्तर देने का प्रयास करना चाहिए ..." की तर्ज पर प्रतिक्रियाओं का स्वागत है।

0
Eric Auld 31 जिंदा 2021, 21:40
आप कुछ कोड उदाहरण प्रदान करना चाह सकते हैं कि आप कौन से फ़ंक्शन कॉल करेंगे, अपेक्षित परिणाम इत्यादि। इस समस्या को हल करने के लिए आपने जो सबसे अच्छा कोड लिखा है, वह अब तक कैसा दिखता है?
 – 
Rulle
31 जिंदा 2021, 22:34
1
1. मानचित्र परिवर्तनशील नहीं हैं। 2. यदि यह डेटा संरचना रिएक्ट को खिलाने जा रही है, तो इसे परिवर्तनशील बनाना शायद सबसे अच्छा विचार नहीं है। 3. घटना श्रोता? कैसे? मुझे लगता है कि ये कच्चे डोम नोड्स नहीं हैं। 4. यह पूरी बात एक चुनिंदा तत्व पर एक अमूर्तता की तरह लगती है, क्या आप इसके लिए जा रहे हैं? 5. आप सही हैं कि यह पूरी बात आधार से थोड़ी हटकर लगती है (पूरी तरह से बाहर नहीं है, लेकिन कुछ फैशन में तिरछी है)। क्या आप हमें कुछ वास्तविक कोड दे सकते हैं और यह क्यों काम कर रहा है या नहीं?
 – 
Jared Smith
31 जिंदा 2021, 23:06
1
"इस प्रश्न का मुद्दा किसी विशेष मुद्दे को हल करना नहीं है" यह SO का संपूर्ण बिंदु है। इसे आपके शोध और प्रत्येक पर किए गए प्रयासों के साथ पांच प्रश्नों में विभाजित किया जाना चाहिए। इसके अलावा, हिक्की (क्लोजर, आइसीडके के निर्माता) क्लोजर की डेटा संरचनाओं पर पी पर चर्चा करता है। उनके 2020 के 6 पेपर, "A History of Clojure" .
 – 
Aaron Bell
1 फरवरी 2021, 05:53
एक नक्शा परिवर्तनीय नहीं है, लेकिन एक परमाणु जिसका राज्य मानचित्रों का संग्रह है, जैसा कि मैंने कहा है, परिवर्तनीय है। मैं सहमत हूं कि कुछ कोड के साथ मेरे प्रश्न में सुधार किया जा सकता है।
 – 
Eric Auld
3 फरवरी 2021, 01:28

1 उत्तर

सबसे बढ़िया उत्तर

आप (I) cursors और reactions, अभिकर्मक परमाणुओं की दो अधिक उन्नत विशेषताओं को देखना चाहते हैं। उनका उपयोग संग्रह और उसके अंदर एक चयनित तत्व के लिए किया जा सकता है जो स्वचालित रूप से अपडेट हो जाता है। उदाहरण के लिए यहां देखें।

मान लीजिए कि आपके पास r/atom वस्तुओं का वेक्टर है और आप एक चयनित वस्तु चाहते हैं जो बदल सकती है, और जो सीधे संपादन योग्य है। इसे प्राप्त करने का एक तरीका यह है कि एक परमाणु को चयनित वस्तु के सूचकांक को संग्रहित करके रखा जाए और फिर

(defn my-get-set
  ([_k] (@vector-of-items @idx-of-selected-item))
  ([_k v] (reagent.core/rswap! my-state-vector assoc @idx-of-selected-item v)))

(def selected-item (reagent.core/cursor my-get-set []))

संपादित करें: reagent.core/cursor my-get-set nil को reagent.core/cursor my-get-set [] में बदला गया। पूर्व समस्याओं की ओर जाता है।

1
Eric Auld 15 मार्च 2021, 23:49