जवाबों:
निश्चित रूप से आप कर सकते हैं, वास्तव में clojure.core
नामस्थान ही इस तरह से विभाजित हो गया है और एक अच्छा मॉडल प्रदान करता है जिसे आप निम्नलिखित में से देख सकते हैं src/clj/clojure
:
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
ये सभी फाइलें एकल clojure.core
नाम स्थान का निर्माण करने के लिए भाग लेती हैं ।
इनमें से एक प्राथमिक फ़ाइल, नाम स्थान नाम से मेल करने के लिए नामित है जब किसी में एक यह उल्लेख है यह पाया जाएगा तो यह है कि :use
या :require
। इस मामले में मुख्य फाइल है clojure/core.clj
, और यह एक ns
फॉर्म के साथ शुरू होती है । यह वह जगह है जहां आपको अपने सभी नामस्थान कॉन्फ़िगरेशन को रखना चाहिए , भले ही आपकी अन्य फाइलों में से किसी को भी उनकी आवश्यकता हो। इसमें सामान्य रूप से शामिल हैं :gen-class
, इसलिए कुछ इस तरह है:
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
तब आपकी प्राथमिक फ़ाइल में उपयुक्त स्थानों पर (आमतौर पर सभी के अंत में) load
आपकी सहायक फ़ाइलों को लाने के लिए उपयोग करते हैं। में clojure.core
यह इस तरह दिखता है:
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
ध्यान दें कि आपको उपसर्ग के रूप में वर्तमान निर्देशिका की आवश्यकता नहीं है, न ही आपको .clj
प्रत्यय की आवश्यकता है ।
सहायक फ़ाइलों में से प्रत्येक को यह घोषित करके शुरू करना चाहिए कि वे किस नामस्थान की मदद कर रहे हैं, लेकिन in-ns
फ़ंक्शन का उपयोग करके ऐसा करना चाहिए । इसलिए ऊपर दिए गए नामस्थान के लिए, सहायक फाइल सभी के साथ शुरू होगी:
(in-ns 'my.lib.of.excellence)
बस इतना ही लगता है।
क्योंकि ये सभी फाइलें एक एकल नाम स्थान का निर्माण कर रही हैं, आपके द्वारा परिभाषित प्रत्येक फ़ंक्शन किसी भी प्राथमिक या सहायक फ़ाइलों में हो सकता है। इसका मतलब यह है कि आप अपने gen-class
किसी भी फ़ाइल में अपने कार्यों को परिभाषित कर सकते हैं :
(defn -main [& args]
...)
ध्यान दें कि क्लोजर के सामान्य ऑर्डर-ऑफ-डेफिनिशन नियम अभी भी सभी कार्यों के लिए लागू होते हैं, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि किसी फ़ंक्शन को परिभाषित करने से पहले उस फ़ंक्शन का उपयोग करने का प्रयास करने से पहले जो भी फ़ाइल लोड होती है।
आपने उस (defn- foo ...)
फॉर्म के बारे में भी पूछा है जो एक नाम स्थान-निजी फ़ंक्शन को परिभाषित करता है। इस तरह परिभाषित किए गए फ़ंक्शंस और साथ ही अन्य :private
संस्करण नामस्थान के भीतर से दिखाई देते हैं जहां वे परिभाषित हैं, इसलिए प्राथमिक और सभी सहायक फ़ाइलों में अब तक लोड की गई किसी भी फ़ाइल में परिभाषित निजी संस्करण तक पहुंच होगी।