Clojure/ინტეგრაცია ჯავასთან
Clojure-ს აქვს საშუელაბე გამოიყენოს ჯავას ობიექტები და პრიმიტივები. ამის ცოდნა აუცილებელია რთული პროგრამების დასაწერად.
მოდით დავიწყოთ ჯავას java.util.Date
ობიექტის შექმნით:
user=> (new java.util.Date)
Mon May 26 10:25:25 PDT 2008
Clojure ქმნის java.util.Date
ობიექტს, შემდეგ იძახებს მის toString()
მეთოდს, ამ ობიექტის ვიზუალურად წარმოდგენისთვის.
ობიექტის კონსტრუქტორში არგუმენტების გადასაცემად, უბრალოდ ჩართეთ ისინი new
გამოძახებაში:
user=> (new StringBuffer "This is the initial value")
This is the initial value
ობიექტის მეთოდის გამოძახებისთვის გამოიყენეთ წერტილის (.) ფორმა:
user=> (. (new java.util.Date) (toString))
"Mon May 26 11:12:15 PDT 2008"
წერტილის ფორმა იყენებს წერტილის სიმბოლოს (.), როგორც ოპერატორს. მეორე არგუმენტია ობიექტი, რომლის მეთოდი უნდა გამოვიძახოთ. მესამე არგუემნტი არის სია, რომელიც შეიცავს მეთოდის სახელს და, თუ საჭიროა, მეთოდის არგუმენტებს:
user=> (. (new java.util.HashMap) (containsKey "key"))
false
სტატიკური მეთოდები შესაძლებელია იგივე გზით გამოვიძახოთ:
user=> (. Boolean (valueOf "true"))
true
კლასის და ეგზემპლარის ველებიც იგივენაირად გამოიძახება:
user=> (. Integer MAX_VALUE)
2147483647
user=> (. Character TYPE)
char
</code>
(წარმატებას გისურვებთ, სტანდარტულ ჯავა ბიბლიოთეკაში ეგზემპლარის <code>public</code> ველის პოვნაში :)
განსხვავება აქ ისაა, რომ ველის სახელი არ არის მოქცეული ფრჩხილებში.
ისევე როგორც ჯავა პროგრამაში, Clojure გაძლევთ საშუალებას კლასების იმპორტირების მოცემულ კონტექსტში, ასე რომ კლასის გამოძახებისას არ იქნება საჭირო მათი სრული სახელის დაწერა:
<source lang="bash">
user=> (import '(java.io FileReader))
nil
user=> (new FileReader "source.txt")
java.io.FileReader@f784d7
იგივე კოდის შემოკლებული ვერსიაც არსებობს:
user=> (import '(java.io FileReader))
nil
user=> (FileReader. "source.txt")
java.io.FileReader@f784d7
ერთი პაკეტიდან რამოდენიმე კლასის იმპორტირება ასე ხდება:
user=> (import '(java.io File FileReader))
nil
ზედა მაგალითში მოხდა როგორც File
, ასევე FileReader
კლასების იმპორტირება.
თუ კლასები განსხვავებულ პაკეტებშია, გამოიყენეთ ასეთი სინტაქსი:
user=> (import '(java.io File) '(java.util HashMap))
nil
ან შეგიძლიათ ორი განცალკევებული import
გამოსახულების გამოყენება:
user=> (import '(java.io File))
nil
user=> (import '(java.util HashMap))
nil