2012-12-25 14 views
6

क्लोजर में अप्रचलित के रूप में प्रतीक को चिह्नित करने का कोई तरीका है?क्लोजर में अप्रचलित प्रतीक

मैं लीन से ऐसा कुछ उपयोग कर सकता हूं जो अच्छी तरह से काम करता है।

https://github.com/technomancy/leiningen/blob/1.x/src/leiningen/core.clj#L13

लेकिन यह केवल अपने चेतावनी का उत्सर्जन करता है जब एक समारोह कहा जाता है। मैं वास्तव में संकलक को उस समय लेने के लिए पसंद करूंगा जब कोड को संकलित किया जाता है, बजाए इसे बजाए जाने के बजाय।

बेशक

, मैं सिर्फ नहीं प्रतीक है, जो संकलक तो लेने जाएगा निर्धारित कर सकते हैं, लेकिन इस तरह के क्यों, या जब प्रतीक पदावनत किया गया है के रूप में किसी भी जानकारी, प्रदान करने की क्षमता के बारे में मुझे लूटता ।

यह सब एक डीएसएल के लिए है जहां उचित दर पर शर्तों का बहिष्कार और अड़चन होने वाला है।

+1

फ़ंक्शन को किसी अन्य फ़ंक्शन के रूप में फिर से परिभाषित करने के बजाय, इसे एक मैक्रो के रूप में फिर से परिभाषित करें जो संकलन समय पर विस्तारित होने पर चेतावनी को छोड़ देता है। – Barmar

+0

@ बाड़ार जो तर्क के रूप में या शाब्दिक में उपयोग करना असंभव बनाता है। भयानक विचार। इसके बजाय, defdeprecated मैक्रो के विस्तार के दौरान चेतावनी को मजबूर करें। (निश्चित रूप से इसका मतलब है कि चेतावनी केवल लाइब्रेरी के संकलन के दौरान होती है, जो कि आप जो भी चाहते हैं वह हो सकता है)। – Cubic

+0

@ क्यूबिक नहीं, यह भी गलत है। बिंदु यह चेतावनी देना है कि जब कोई क्लाइंट अनुप्रयोग अप्रचलित फ़ंक्शन _us_ करता है, तब लाइब्रेरी संकलित नहीं होता है। मुझे लगता है कि जो वास्तव में चाहता था वह क्लोजर कंपाइलर में विशेष समर्थन लेगा। – Barmar

उत्तर

1

मैक्रोज़ का उपयोग करने के बारे में टिप्पणियों में पहले से ही कुछ है, लेकिन जैसा कि किसी ने नोट किया है कि यह कार्य को एचओएफ के रूप में उपयोग करने से रोकता है। आप इसके चारों ओर मिल सकते हैं, हालांकि यह हो सकता है कि इलाज बीमारी से भी बुरा नहीं है। उदाहरण के लिए, मान लें कि आपकी समारोह

(defn foo* [x y] (+ x y)) 

फिर

(defmacro foo [x y] (warn) `(foo* x y)) 
(foo 1 2) 
(map foo [5 6] [7 8]) 

लिखने की बजाय है आप macroexpansion वापसी एक समारोह है, जो निश्चित रूप से किसी भी अन्य की तरह इस्तेमाल किया जा सकता कर सकते हैं:

(defmacro foo [] (warn) `foo*) 
((foo) 1 2) 
(map (foo) [5 6] [7 8]) 

शायद अजीबता के लायक नहीं है, लेकिन जब भी बहिष्कृत सुविधा का उपयोग किया जाता है तब भी शिकायत करने का एक तरीका प्रदान करता है एचओएफ उपयोग के वाई।

0

यह वास्तव में इस पर निर्भर करता है कि आपका डीएसएल कैसे डिज़ाइन किया गया है।

  1. macroexpand-all (clojure.walk से) पारित कर दिया फार्म के लिए: यदि आप अपने डीएसएल ऐसी है कि प्रत्येक प्रपत्र एक go या कुछ इसी तरह के कॉल में लिपटे किया जाना चाहिए डिजाइन कर सकते हैं तो आप इस go मैक्रो जो कुछ इस तरह करता है लिख सकता है
  2. उपर्युक्त फॉर्म पर postwalk (clojure.walk से) का उपयोग करें और जांचें कि किसी भी प्रतीक का सामना करना संभवतः बहिष्कृत प्रतीकों की कुछ वैश्विक सूची को देखकर बहिष्कृत किया गया है। प्रतीक के नाम के योग्य नाम प्राप्त करने के लिए आपको प्रतीकों पर resolve करने की आवश्यकता हो सकती है।
  3. यदि कोई बहिष्कृत प्रतीक मिला, तो प्रिंट संदेश।
  4. इनपुट फॉर्म को वापस लौटें।

यह go मैक्रो तब आपके डीएसएल के अन्य प्री-प्रोसेसिंग के लिए उपयोग किया जा सकता है क्योंकि यह आपके डीएसएल निष्पादन के लिए प्रवेश बिंदु है।

नोट: आपको समाधान के साथ आने की आवश्यकता हो सकती है जहां उपयोगकर्ता बहिष्कृत प्रतीकों में से किसी एक के अपने प्रतीक के लिए समान नाम का उपयोग करता है, लेकिन फिर इसकी आवश्यकता नहीं हो सकती है आपके डीएसएल डिज़ाइन पर निर्भर करता है।

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