2013-02-08 41 views
9

हमें बताएं कि मेरे पास X.clojurescript और X.clojure नामस्थान है। X.clojurescript में सब कुछ क्लोजरस्क्रिप्ट कोड है, X.clojure में सब कुछ क्लोजर कोड है। दुर्भाग्य से, मैं Clojurescript में सीधे मैक्रो भी निर्धारित नहीं कर सकते हैं, मैं उन्हें Clojure में परिभाषित करने और फिर उन्हेंक्लोजरस्क्रिप्ट मैक्रोज़ से आवश्यक क्लोजरस्क्रिप्ट कोड से मैं कैसे निपटूं?

(ns X.clojurescript.abc 
    (:require-macros [X.clojure.def :as clj])) 

यह ठीक है का उपयोग कर एक Clojurescript नाम स्थान में लाने के लिए किया है। हालांकि, क्या होगा यदि मैक्रो (X.clojure में परिभाषित) को क्लोजरस्क्रिप्ट नेमस्पेस (X.clojurescript) में परिभाषित कुछ संदर्भित करने की आवश्यकता होगी? समस्या यह है कि क्लोजर कंपाइलर अन्य नेमस्पेस को हल करते समय मेरे क्लोजरस्क्रिप्ट नेमस्पेस (एक अलग निर्देशिका) में नहीं दिखता है।

मुझे अपने क्लोजर कोड में केवल नामस्थान बनाकर इस समस्या के आसपास मिल गया है, जिसमें क्लोजर्सक्रिप्ट में मौजूद समान नामस्थान और आवश्यक परिभाषा है, लेकिन यह बेवकूफ लगता है। इसलिए, उदाहरण के लिए, यदि मुझे अपने मैक्रो में X.clojurescript.abc.y की आवश्यकता है, तो मैं क्लोजर पक्ष पर एक अतिरिक्त नामस्थान बनाउंगा जो X.clojurescript.abc के क्लोजर संस्करण में डमी वाई को परिभाषित करता है; गूंगा प्रकार

मैं मैक्रो से कैसे निपटूं जिसे क्लोजरस्क्रिप्ट पक्ष पर कुछ संदर्भित करने की आवश्यकता है?

+0

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

+2

का उत्तर देना बहुत आसान होगा, मुझे नहीं लगता कि मैं आपका प्रश्न समझता हूं। आपके मैक्रो को उस कोड को * जेनरेट करना होगा जिसे क्लोजरस्क्रिप्ट में मूल्यांकन किया जाएगा। तो अगर आपको किसी भी क्लोजरस्क्रिप्ट डीफ़ को संदर्भित करना है तो मैक्रो के विस्तार में प्रतीक उत्पन्न करने के लिए पर्याप्त नहीं होगा? – KIMA

+0

'क्लोजरस्क्रिप्ट पक्ष पर कुछ देखें' आपको मैक्रो विस्तार समय पर इसकी आवश्यकता है या यह कुछ ऐसा होगा जो आउटपुट कोड में उत्सर्जित होगा? – Ankur

उत्तर

6

परिभाषा के समय एक मैक्रो को एक विशिष्ट नामस्थान की आवश्यकता होती है, यदि मैक्रो प्रतीकों की सूची उत्पन्न करने के लिए नामस्थान से कोड का उपयोग कर रहा है तो यह वापस आ जाएगा।

आप repl में इन उदाहरणों के साथ पालन कर सकते हैं:

(defmacro foo 
    [a] 
    `(bar/bar ~a)) 

foo की परिभाषा संकलन होगा, भले ही बार एक परिभाषित नाम स्थान

(foo :a) 

foo कॉलिंग की सुविधा अब क्योंकि आप असफल हो जायेगी नहीं है बार नेमस्पेस, या फंक्शन बार को अभी तक परिभाषित नहीं किया है

(ns bar) 
(defn bar 
    [x] 
    [x x]) 

बार नाम स्थान में बार परिभाषित करता है

(ns user) 
(foo :a) 

=> [: एक: एक]

सूचना है कि बार foo की परिभाषा के समय मौजूद की जरूरत नहीं है। वास्तव में नामस्थान को foo की परिभाषा के समय भी मौजूद होने की आवश्यकता नहीं है।

+0

संकलन एक बात है, लेकिन क्लोजरस्क्रिप्ट पक्ष पर लाइब्रेरी की आवश्यकता के बारे में क्या है? उपरोक्त आपके उदाहरण में, ऐसा लगता है कि आपको क्लोजरस्क्रिप्ट मॉड्यूल में बार नेमस्पेस की आवश्यकता है जो foo macro को कॉल कर रहा है, जिसका अर्थ है कि कॉलिंग मॉड्यूल को मैक्रो के बारे में कार्यान्वयन विवरण पता होना चाहिए। –

+0

मैंने जिस समस्या का उल्लेख किया है उसका एक उदाहरण हैकपप्स लाइब्रेरी द्वारा अनुभव किया जाता है। आप यहां उनका समाधान देख सकते हैं, जो हैकी की तरह है: https://github.com/teropa/hiccups#usage –

+1

मुझे लगता है कि यह क्लोजरस्क्रिप्ट के कार्यान्वयन के साथ एक मौलिक समस्या है क्योंकि यह मौजूद है।मैं सुझाव दे रहा हूं कि मैं इसके साथ काम करने का सबसे अच्छा तरीका मानता हूं, लेकिन मुझे समझ में आता है कि यह आदर्श से कम है। लेकिन मूल रूप से यह शुद्ध क्लोजर कोड में मैक्रोज़ का उपयोग करने के तरीके से अलग नहीं है - मैक्रो उन कार्यों को देखता है जो इसे आमंत्रण समय पर प्रतीक उत्पन्न करते हैं। – noisesmith