আপডেট : যেহেতু এই উত্তরটি পোস্ট করা হয়েছিল, তাই উপলব্ধ কিছু সরঞ্জাম পরিবর্তিত হয়েছে। মূল উত্তরের পরে, বর্তমান সরঞ্জামগুলির সাহায্যে উদাহরণ কীভাবে তৈরি করবেন সে সম্পর্কে তথ্য সহ একটি আপডেট রয়েছে।
এটি কোনও জারকে সংকলন করা এবং অভ্যন্তরীণ পদ্ধতিগুলি কল করার মতো সহজ নয়। যদিও এটি সমস্ত কাজ করার জন্য কয়েকটি কৌশল আছে। এখানে একটি সাধারণ ক্লোজার ফাইলের একটি উদাহরণ যা একটি জারে সংকলন করা যায়:
(ns com.domain.tiny
(:gen-class
:name com.domain.tiny
:methods [#^{:static true} [binomial [int int] double]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
c
(recur (inc b) (* (/ (- a b) b) c))))))
(defn -binomial
"A Java-callable wrapper around the 'binomial' function."
[n k]
(binomial n k))
(defn -main []
(println (str "(binomial 5 3): " (binomial 5 3)))
(println (str "(binomial 10042 111): " (binomial 10042 111)))
)
আপনি যদি এটি চালনা করেন তবে আপনার এমন কিছু দেখতে পাওয়া উচিত:
(binomial 5 3): 10
(binomial 10042 111): 49068389575068144946633777...
এবং এখানে একটি জাভা প্রোগ্রাম যা -binomial
ফাংশনটিকে কল করে tiny.jar
।
import com.domain.tiny;
public class Main {
public static void main(String[] args) {
System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
}
}
এটির ফলাফল:
(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263
জাদুটির প্রথম অংশটি বিবৃতিতে :methods
কীওয়ার্ডটি ব্যবহার করছে gen-class
। জাভাতে স্থির পদ্ধতির মতো ক্লোজার ফাংশনটি অ্যাক্সেস করতে আপনাকে এটি আবশ্যক বলে মনে হচ্ছে।
দ্বিতীয় জিনিসটি একটি মোড়ক ফাংশন তৈরি করা যা জাভা দ্বারা কল করা যেতে পারে। লক্ষ্য করুন যে এর দ্বিতীয় সংস্করণটির -binomial
সামনে একটি ড্যাশ রয়েছে।
এবং অবশ্যই ক্লোজুর জারটি নিজেই বর্গ পথে চলতে হবে। এই উদাহরণটি Clojure-1.1.0 জার ব্যবহার করেছে।
আপডেট : নিম্নলিখিত উত্তরগুলি ব্যবহার করে এই উত্তরটি পুনরায় পরীক্ষা করা হয়েছে:
- বন্ধ
- লিনিঙ্গেন ২.১.৩
- জেডিকে 1.7.0 আপডেট 25
ক্লোজার পার্ট
প্রথমে লিনিনজেন ব্যবহার করে একটি প্রকল্প এবং সম্পর্কিত ডিরেক্টরি কাঠামো তৈরি করুন:
C:\projects>lein new com.domain.tiny
এখন, প্রকল্প ডিরেক্টরিতে পরিবর্তন করুন।
C:\projects>cd com.domain.tiny
প্রকল্প ডিরেক্টরিতে project.clj
ফাইলটি খুলুন এবং এটিকে সম্পাদনা করুন যাতে বিষয়বস্তুগুলি নীচে প্রদর্শিত হবে।
(defproject com.domain.tiny "0.1.0-SNAPSHOT"
:description "An example of stand alone Clojure-Java interop"
:url "http://clarkonium.net/2013/06/java-clojure-interop-an-update/"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:aot :all
:main com.domain.tiny)
এখন, নিশ্চিত হয়ে নিন যে সমস্ত নির্ভরতা (ক্লোজার) উপলব্ধ।
C:\projects\com.domain.tiny>lein deps
আপনি এই মুহুর্তে ক্লোজার জারটি ডাউনলোড করার বিষয়ে একটি বার্তা দেখতে পাবেন।
এখন ক্লোজার ফাইলটি C:\projects\com.domain.tiny\src\com\domain\tiny.clj
এমনভাবে সম্পাদনা করুন যাতে এটির মূল উত্তরে প্রদর্শিত ক্লোজার প্রোগ্রাম রয়েছে। (এই ফাইলটি তৈরি করা হয়েছিল যখন লেনিনজেন প্রকল্পটি তৈরি করেছিলেন))
এখানে বেশিরভাগ যাদু নেমস্পেসের ঘোষণায় রয়েছে। :gen-class
একটি বর্গ নামে তৈরি করতে সিস্টেম বলে com.domain.tiny
নামক একটি একক স্থির পদ্ধতি সঙ্গে binomial
, একটি ফাংশন দুই পূর্ণসংখ্যা আর্গুমেন্ট গ্রহণ এবং একটি ডবল ফিরিয়ে আনে। দুটি অনুরূপ নামের ফাংশন রয়েছে binomial
, একটি aতিহ্যবাহী ক্লোজার ফাংশন এবং -binomial
জাভা থেকে অ্যাক্সেসযোগ্য মোড়ক। ফাংশনের নামে হাইফেনটি নোট করুন -binomial
। ডিফল্ট উপসর্গটি একটি হাইফেন, তবে এটি যদি ইচ্ছা হয় তবে এটি অন্য কোনও কিছুতে পরিবর্তন করা যায়। -main
আমরা সঠিক ফলাফল পাচ্ছি তা নিশ্চিত করার জন্য ফাংশনটি দ্বিপদী ফাংশনে কেবল কয়েকটি কল করে। এটি করার জন্য, ক্লাসটি সংকলন করুন এবং প্রোগ্রামটি চালান।
C:\projects\com.domain.tiny>lein run
আপনার আসল উত্তরে দেখানো আউটপুট দেখতে হবে।
এখন এটি একটি পাত্রে প্যাকেজ করুন এবং এটি কোথাও সুবিধাজনক রাখুন। ক্লোজারের জারটিও সেখানে অনুলিপি করুন।
C:\projects\com.domain.tiny>lein jar
Created C:\projects\com.domain.tiny\target\com.domain.tiny-0.1.0-SNAPSHOT.jar
C:\projects\com.domain.tiny>mkdir \target\lib
C:\projects\com.domain.tiny>copy target\com.domain.tiny-0.1.0-SNAPSHOT.jar target\lib\
1 file(s) copied.
C:\projects\com.domain.tiny>copy "C:<path to clojure jar>\clojure-1.5.1.jar" target\lib\
1 file(s) copied.
জাভা পার্ট
লিনিনগেনের একটি অন্তর্নির্মিত টাস্ক রয়েছে, lein-javac
যা জাভা সংকলনে সাহায্য করতে সক্ষম হওয়া উচিত। দুর্ভাগ্যক্রমে, এটি সংস্করণ ২.১.৩ এ বিভক্ত বলে মনে হচ্ছে। এটি ইনস্টল করা জেডিকে খুঁজে পাচ্ছে না এবং এটি ম্যাভেন সংগ্রহশালাটি খুঁজে পাবে না। উভয় পথেই আমার সিস্টেমে এম্বেড শূন্যস্থান রয়েছে। আমি ধরে নিলাম যে সমস্যা। যেকোন জাভা আইডিই সংকলন এবং প্যাকেজিং পরিচালনা করতে পারে। তবে এই পোস্টের জন্য, আমরা পুরানো স্কুলে যাচ্ছি এবং কমান্ড লাইনে এটি করছি।
প্রথমে Main.java
মূল উত্তরে প্রদর্শিত সামগ্রীর সাহায্যে ফাইলটি তৈরি করুন ।
জাভা অংশ সংকলন করতে
javac -g -cp target\com.domain.tiny-0.1.0-SNAPSHOT.jar -d target\src\com\domain\Main.java
আমরা যে জারটি তৈরি করতে চাই তাতে যোগ করতে এখন কিছু মেটা-তথ্য দিয়ে একটি ফাইল তৈরি করুন। ইন Manifest.txt
, নিম্নলিখিত পাঠ্য যোগ করুন
Class-Path: lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar
Main-Class: Main
এখন আমাদের ক্লোজার প্রোগ্রাম এবং ক্লোজার জার সহ এটি একটি বড় জার ফাইলে প্যাকেজ করুন।
C:\projects\com.domain.tiny\target>jar cfm Interop.jar Manifest.txt Main.class lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar
প্রোগ্রামটি চালাতে:
C:\projects\com.domain.tiny\target>java -jar Interop.jar
(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263
আউটপুটটি ক্লোজিউরের একা উত্পাদিত মূলত অভিন্ন, তবে ফলাফলটি জাভা ডাবলে রূপান্তরিত হয়েছে।
উল্লিখিত হিসাবে, একটি জাভা আইডিই সম্ভবত অগোছালো সংকলন যুক্তি এবং প্যাকেজিংয়ের যত্ন নেবে।