मान लें कि मैं कई घटकों के साथ एक बड़ी क्लोजर लाइब्रेरी बनाना चाहता हूं। एक डेवलपर के रूप में, मैं कई घटकों को अलग-अलग नामस्थानों में रखना चाहता हूं क्योंकि कई सहायक कार्यों के समान नाम हो सकते हैं। मैं जरूरी चीजों को निजी बनाना नहीं चाहता क्योंकि उनके पास अत्यधिक मामलों में उपयोगिता हो सकती है और निजी के पीछे काम-आसपास अच्छा नहीं है। (दूसरे शब्दों में, मैं कोड उपयोग का सुझाव देना चाहता हूं, पूरी तरह से उपयोग को रोक नहीं सकता।)सार्वजनिक खपत के लिए क्लोजर पुस्तकालयों का निर्माण करते समय आप फ़ंक्शन नाम कैसे व्यवस्थित करते हैं?
हालांकि, मैं पुस्तकालय के उपयोगकर्ताओं को कई कार्यों के सबसेट के संघ के साथ नामस्थान में काम करना चाहता हूं प्रत्येक उप पुस्तकालय। ऐसा करने के लिए बेवकूफ या सबसे अच्छा तरीका क्या है? मेरे दिमाग में आने वाला एक समाधान है जो उत्पन्न करता है एक मैक्रो लिखना: आवश्यक नामों की किसी दिए गए सूची को परिभाषित करके एक नया वैर मैपिंग बनाना आवश्यक है (पहले कोड उदाहरण देखें)। क्या इस विधि के साथ ट्रेडऑफ हैं जैसे कि विस्तार के प्रकार क्या होता है? क्या कोई बेहतर तरीका है (या निर्मित)?
मैक्रो उदाहरण (src/mylib/public.clj):
(ns mylib.public
(:require [mylib.a :as a])
(:require [mylib.b :as b]))
(transfer-to-ns [+ a/+
- b/-
cat b/cat
mapper a/mapper])
फिर से, स्पष्ट करने के लिए, अंतिम लक्ष्य बनाने के लिए सक्षम होने के लिए mylib के उपयोगकर्ताओं द्वारा बनाए गए अन्य परियोजनाओं में कुछ फ़ाइल के लिए किया जाएगा की तरह कुछ (src/someproject/core.clj):
(ns someproject.core
(:require [mylib.public :as mylib]))
(mylib/mapper 'foo 'bar)
@Jeremy दीवार, ध्यान दें कि आपके प्रस्तावित समाधान मेरी जरूरतों fullfill नहीं है। आइए मान लें कि निम्न कोड मौजूद है।
mylib/a.clj:
(ns mylib.a)
(defn fa [] :a)
mylib/b.clj:
(ns mylib.b)
(defn fb [] :b)
mylib/public.clj:
(ns mylib.public
(:use [mylib.a :only [fa]])
(:use [mylib.b :only [fb]]))
somerandomproject/core.clj: (मान लें कि क्लासपाथ सही तरीके से सेट हैं)
(ns somerandomproject.core
(:require [mylib.public :as p])
;; somerandomproject.core=> (p/fa)
;; CompilerException java.lang.RuntimeException: No such var: p/fa, compiling: (NO_SOURCE_PATH:3)
;; somerandomproject.core=> (mylib.a/fa)
;; :a
यदि आप नोटिस करते हैं, mylib/public.clj में "उपयोग" फ़ंक्शन public.clj को इन वर्रों को उपयोगकर्ता फ़ाइल somerandomproject/core.clj पर प्रदान करने की अनुमति नहीं देते हैं।
अच्छा उत्तर देखें। यह वही है जो मैं था तलाश कर रहा हूं। मैंने पहले compojure.core शैली की कोशिश की है लेकिन आप जिन सीमाओं के बारे में बात करते हैं, उनके साथ मारा गया था, इसलिए मैं संभावित विकल्पों की तलाश में था। मैं लैमिना की जांच करूंगा और देख सकता हूं कि यह स्वीकार करने से पहले कैसे काम करता है। – bmillare
कैस्कलॉग इसी तरह के साथ आयोजित किया जाता है लैमिना के लिए रेखाएं लेकिन थोड़ा कम सख्ती से - आपको जो मुख्य चीजें चाहिए, वह कैस्कलॉग.एपीआई एनएस में या उसके अंदर है या नहीं, लेकिन आप अधिक उन्नत कार्यक्षमता के लिए अंतर्निहित एनएस में भी पहुंच सकते हैं। –