2010-08-13 15 views
11

क्लोजर में नामस्थान और जावा पैकेज आयात के साथ काम करने के लिए बड़ी संख्या में फ़ंक्शन/मैक्रोज़ हैं। नेमस्पेस के सेट अप को समझने के लिए (सीमित) को क्लोजर प्रक्रिया (प्रतिलिपि) में राज्य माना जा सकता है।क्लोजर नेमस्पेस प्रबंधन - क्लोजर प्रतिकृति नामस्थान, आयात इत्यादि की स्थिति को सहेजने और पुनर्स्थापित करने का कोई तरीका है?

एक आरईपीएल सत्र में सक्रिय रूप से काम करते समय, विशेष रूप से जब स्रोत फाइलें (पुनः) लोड हो जाती हैं, तो मुझे उलझन में आसान लग सकता है - अक्सर जब मैं नामस्थान कॉन्फ़िगरेशन में गलती या वाक्यविन्यास त्रुटि करता हूं। अन्य बार मैं नामस्थान/उपनाम/संदर्भ फ़िल्टर को पुन: सक्रिय करने का प्रयास करना चाहता हूं लेकिन आरईपीएल को पुनरारंभ किए बिना मौजूदा नेमस्पेस स्थिति से आसानी से वापस नहीं आ सकता। कुछ आरईपीएल पर आयात पुस्तकालय बाहर कोशिश कर के बाद फिर वापस कि "क्लीन-स्लेट" के लिए मिलता है - जैसे के बाद कोड के मुख्य शरीर repl पर लोड किया जाता है के रूप में -

उदाहरण के लिए मैं नाम स्थान विन्यास जांच की चौकी के लिए सक्षम होना चाहते हैं ताकि मैं तुरंत एक स्रोत फ़ाइल का परीक्षण कर सकूं जो एनएस मैक्रो के हिस्से के रूप में उस लाइब्रेरी में विधियों के फ़िल्टर किए गए सबसेट आयात करता है।

क्या लोग नामस्थान कॉन्फ़िगरेशन को सहेजने और पुनर्स्थापित करने के तरीकों की सिफारिश कर सकते हैं?

+1

यह _save-world_ कार्यक्षमता की तरह लगता है कि कई सामान्य लिस्प कार्यान्वयन होते हैं। – Greg

+0

यह निश्चित रूप से संभव है, (clojure.lang.Namespace/all) और .getMappings का उपयोग करके, लेकिन मुझे कोई संकेत नहीं मिल रहा है कि किसी ने इसे किया है। – dreish

उत्तर

10

मुझे यकीन है कि कुछ इसके साथ गलत है, क्योंकि मैंने इसे अभी इस प्रश्न के उत्तर में लिखा है, लेकिन मैं स्वयं को अपनी परियोजनाओं में यह सुनिश्चित करने के लिए देख रहा हूं। बस: इसे आयात करें (इसे अपनी परियोजना में अपनी फ़ाइल में रखें) और इसे उदारता से उपयोग करें।

(ns world) 


(defn save-world 
    [] 
    (let [syms (filter identity (distinct (for [i (ns-map *ns*)] (first i))))] 
    (for [i syms] 
     (vector i 
       (ns-resolve *ns* i))))) 

(defn destroy-world-but 
    [saved] 
    (let [syms (filter identity (distinct (for [i (ns-map *ns*)] (first i))))] 
    (for [i syms] 
     (if-not (or (= (ns-resolve *ns* i) (ns-resolve *ns* saved)) 
        (= (ns-resolve *ns* i) (ns-resolve *ns* 'restore-world)) 
        (= (ns-resolve *ns* i) (ns-resolve *ns* '*ns*))) 
     (ns-unmap *ns* i))))) 

(defn restore-world 
    [saved] 
    (clojure.core/map 
    #(intern *ns* (clojure.core/first %) (clojure.core/second %)) 
    saved)) 

पहले, बचाने के अपने दुनिया (एक तुम वापस जाना चाहता हूँ) इस तरह के एक राज्य:

(def *save* (save-world)) 

फिर जो चाहो-प्रयोग करते हैं। जब आप अपने पूर्व राज्य में वापस जाने के लिए तैयार हों:

(destroy-world-but '*save*) 
(restore-world *save*) 

और आपको जाने के लिए अच्छा होना चाहिए!

(उम्मीद है कि यह काम करता है! के लिए काम कर रहा था मुझे पता है वहाँ कोई समस्या होने पर मुझे कृपया करते हैं। मैं इस, भी करने के लिए एक बेहतर तरीका है यकीन है, लेकिन यह काम करता है और यह कितनी दूर मैं आज रात। मैं गया है मुझे यकीन है कि मैं संशोधित करूंगा।)

6

यह हमेशा काम नहीं करेगा। आप ns-unmap के साथ नामस्थान से वर्र्स को हटा सकते हैं, लेकिन कोड के अन्य टुकड़े अभी भी उन परिभाषाओं के संदर्भ रख सकते हैं।

क्लोजर, क्योंकि यह जेवीएम पर आधारित है, इसमें कुछ सामान्य लिस्प या योजना कार्यान्वयन जैसी "स्मृति छवि" की कोई अवधारणा नहीं है।

+0

चेतावनी अच्छी तरह से लिया गया। इसलिए यदि मैं उदाहरण के लिए एक जटिल लंबे समय तक चलने वाले ऐप की स्थिति को सहेजने और पुनर्स्थापित करने की कोशिश कर रहा था तो मुझे बहुत परेशानी हो सकती थी। लेकिन एक ही प्रतिलिपि सत्र में जरूरी कार्यों के सामान्य उपयोग मामले के लिए/मुझे लगता है कि मैं शायद कुछ ऐसा कर रहा हूं जैसे इसाक नीचे दिखाता है। –

1

डीएमटीसीपी एक बेकार तरीके से नौकरी कर सकता है। डीएमटीसीपी पर Google: वितरित मल्टी थ्रेडेड चेकपॉइंटिंग। मैं इसे इंटरैक्टिव ओकैमल कार्यक्रमों की जांच करने के लिए उपयोग करता हूं।

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