2010-04-25 16 views
5

'आवश्यकता' कमांड को ओवरराइड करना संभव होगा ताकि यह एक निश्चित संसाधन डाउनलोड करने का प्रयास करेगा यदि यह स्थानीय मशीन पर नहीं मिला था। उदाहरण के लिए:क्लोजर में 'आवश्यकता' ओवरराइड करना?

(require 'examples.introduction) 
; if not found => download from the net 
; (url: http://media.pragprog.com/titles/shcloj/code/examples/introduction.clj) 

उत्तर

4

आप require समारोह रद्द कर सकते थे और निश्चित रूप से ओवरराइड संस्करण सामान डाउनलोड कर सकते हैं, तो इसके लिए नाम स्थान में पूछा गया था classpath पर उपलब्ध नहीं है। रूपों में काम करने के तरीके को ओवरराइड करना, AFAIK, अब ns को संभालने के तरीके के कारण असंभव है।

ध्यान दें कि 'require' डाउनलोड करना बहुत उपयोगी नहीं होगा यदि आप क्लासपाथ (नए जार समेत) पर नए पथ रखना चाहते हैं, क्योंकि क्लासपाथ इंजेक्शन क्लोजर में विश्वसनीय रूप से काम नहीं करता है (जेवीएम मुद्दों के कारण) । वहां clojure.core/add-classpath है ... लेकिन इसे हमेशा के लिए अब से बहिष्कृत के रूप में चिह्नित किया गया है, इसका उपयोग दृढ़ता से निराश है, इस बात की कोई गारंटी नहीं है कि यह आपके लिए काम करेगा और यह स्थिति जल्द ही कभी भी बदलने की संभावना नहीं है। दूसरी तरफ, यदि आप किसी निर्देशिका में नई स्रोत फ़ाइलों को रखना चाहते थे जो क्लासपाथ पर पहले से मौजूद था, तो उसे ठीक काम करना चाहिए।

मामले में आप अधिभावी require के साथ चारों ओर खेलने के लिए, यदि आप एक foo नाम स्थान है, तो आप

(ns foo 
    (:refer-clojure :exclude [require]) 
    ; other stuff; any :requires here will work as usual! 
) 

कर सकता है तो फिर परिभाषित करना चाहते हैं अपनी खुद की आवश्यकता होती है, clojure.core/require का उपयोग करते समय उचित:

(defn require [ns-symbol] 
    (do-stuff-to-obtain-the-namespace)) 

clojure.contrib.find-namespaces नेमस्पेस क्लासपाथ पर उपलब्ध चीज़ों को जानने में सहायक हो सकता है। (या आप the-ns समारोह का उपयोग करें और देखें कि क्या वह clojure.core/require के माध्यम से नाम स्थान की आवश्यकता होती है पर एक प्रारंभिक प्रयास के बाद एक अपवाद फेंकता सकता है।)

ध्यान दें कि binding दृष्टिकोण है जो पहले दिमाग में आ सकते हैं ((binding [require ...] ...)) काम नहीं करेगा, के बाद से require आम तौर पर एक वार clojure.core नाम स्थान और नामस्थान जिनके नाम clojure के साथ शुरू वर्तमान में सीधे संकलक से जुड़े हुए हैं से Vars में प्रशिक्षु पर ले कर (कोई वास्तविक वार देखने अर्थ क्रम में किया जाता है, इसलिए उन Vars की rebinding कोड पर कोई प्रभाव नहीं) ।

(:refer-clojure :exclude [require]) अपने नाम स्थान के लिए ns रूप में clojure.core/require को हल करने से require रोकता है और आप अपने खुद के नाम स्थान में उस नाम का एक वार को परिभाषित करने के लिए स्वतंत्र छोड़ देता है। जैसा ऊपर बताया गया है, यह clojure.core/require Var को सुलभ होने से नहीं रोकता है यदि आप पूरी तरह योग्य प्रतीक टाइप करते हैं।

+0

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

+0

इसके विपरीत, यह इसके बारे में जाने का एक बेहतर तरीका प्रतीत होता है।मुझे यह कहना है कि, व्यावहारिक शर्तों में, * सर्वश्रेष्ठ * तरीका, लीनिंगेन/मेवेन को किसी लाइब्रेरी निर्भरता प्राप्त करना होगा, और किताबों के साथ स्रोत कोड जैसी चीजों के लिए, बस इसे हाथ से डाउनलोड करें ...: -) यह नहीं कि एक फंकी आवश्यकता लिखने के मजे से कुछ भी लेता है जो स्वयं ही ऐसा करेगा! –

1

वास्तव में, (एड-classpath "http://foo/bar/baz/src/") या (एड-classpath "http://www.foo.com/bar.jar"), की अनुमति दूरस्थ सामान की आवश्यकता होती है जाएगा।

माइकल की चेतावनियां हालांकि लागू होती हैं: केवल प्रतिलिपि पर टॉयइंग के लिए इसका उपयोग करें ...

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