একাধিক ফাইলের উপরে ক্লোজারের নেমস্পেস বিভক্ত করা


91

সামনের সময়ের সাথে সংকলন করার সময় কি একাধিক উত্স ফাইলের উপর ক্লোজারের নেমস্পেসকে ভাগ করা সম্ভব :gen-class? কীভাবে (:main true)এবং (defn- ...)খেলার মধ্যে আসা?

উত্তর:


138

ওভারভিউ

অবশ্যই আপনি পারবেন, প্রকৃতপক্ষে 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ভার্সগুলি নাম স্থানের মধ্যে যেখানে সেগুলি সংজ্ঞায়িত করা হয়েছে সেগুলি থেকে দৃশ্যমান হয়, তাই প্রাথমিক এবং সমস্ত সহায়ক ফাইলগুলি এখন পর্যন্ত লোড হওয়া যে কোনও ফাইলগুলিতে সংজ্ঞায়িত ব্যক্তিগত ওয়ারে অ্যাক্সেস পেতে পারে।


4
খুব সুন্দর, সম্পূর্ণ উত্তর! বিটিডাব্লু, দ্য জোয় অফ ক্লোজারের মধ্য দিয়ে আমি আমার প্রথম পাসটি প্রায় শেষ করেছি । দুর্দান্ত বই!
রাল্ফ

এই উত্তর ভাগ করে নেওয়ার জন্য ধন্যবাদ। এটি এখনও একটি ভাল অনুশীলন হিসাবে বিবেচনা করা হয়, 2 বছর পরে? (আমি জানি জিনিসগুলি দ্রুত পরিবর্তন হয়)) আমি দেখতে পাই যে ক্লোজুরে নিজেই এই কৌশলটি ব্যবহার করে।
ডেভিড জে

9
আজকের হিসাবে এটি এখনও সর্বোত্তম অনুশীলন যদি আপনি নিশ্চিত হন যে আপনি একাধিক ফাইল একক নেমস্পেস তৈরি করতে চান। তবে, এখন এটি নিজের চেয়ে কম সাধারণ হতে পারে। একটি বিকল্প আপনার এনএস এর সমস্ত পাবলিক ওয়ারগুলি একটি ফাইলে সংজ্ঞায়িত করা এবং সমস্ত সহায়ক সাহায্যকারীর কাজ এবং ক্রিয়াকলাপকে একটি পৃথক "বাস্তবায়ন" নেমস্পেসে স্থানান্তর করা হতে পারে। ইমপ্লের বারগুলি প্রযুক্তিগতভাবে জনসাধারণ্যে প্রকাশিত হবে তবে এনএস ডক্টরিং নির্দেশ করে যে তারা নথিভুক্ত এপিআইয়ের অংশ নন এটি সাধারণ এবং এটি পর্যাপ্ত হওয়া উচিত।
চৌসার

4
আমরা কি জানি যে কোনও সাধারণ ক্লোজার টুলিংয়ের মাল্টি-ফাইলের নেমস্পেসগুলি বোঝার সমস্যা আছে কিনা? লেন? বুট? সিডার? এনআরইপিএল? কিবিট? ইস্টউড? ক্লোভারেজ? ইত্যাদি ...
দিদিয়ার এ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.