Clojure/ცვლადების და ფუნქციების გამოცხადება

გლობალური ცვლადის განსაზღვრისთვის გამოიყენება def ფორმა:

user=> (def x 5)
#'user/x

user=> x
5

user=> (+ 5 x)
10

user=> (def my-list '(1 2 3))
#'user/my-list

user=> my-list
(1 2 3)

user=> (last my-list)
3

როდესაც ცვლადი იქმნება ხდება შემდეგი რამ. ის რასაც def აბრუნებს არის var, რომელიც არის ობიეტქი, რომელსაც აქვს მნიშვნელობა, მაგალითად 5. აგრეთვე იქმნება სიმბოლო, რომელიც ებმება ამ var-ს.

ფუნქციები შეიძლება შეიქმნას defn-ის გამოყენებით:

user=> (defn election-year? [year]
  (zero? (rem year 4)))

#'user/election-year?
user=> (election-year? 2007)
false

user=> (election-year? 2008)
true

ფუნქცია არის ობიექტის ნაირსახეობა, რომლის გამოძახება შეიძლება.

პირვალი არგუმენტი defn-ში არის ფუნქციის სახელი, რომელიც იქნება სიმბოლო, მიბმული ამ ფუნქციაზე. მეორე არგუმენტი არის ფუნქციის არგუმენტების სია. არგუმენტების სია ყოველთვის ვექტორით გამოისახება. defn-ის დარჩენილი არგუმენტები შეიძლება იყოს ერთი ან რამდენიმე გამოსახულება. ბოლო გამოსახულების შედეგი არის ფუნქციის დასაბრუნებელი მნიშვნელობა.

fn-ის გამოყენება

რედაქტირება

ანონიმური ფუნქცია შეიძლება შეიქმნას fn-ის გამოყენებით:

user=> (fn [x] (+ x 1))
user.eval__2384$fn__2386@c4b579

user=> ((fn [x] (+ x 1)) 9)
10

რადგანაც ფუნქციები უბრალოდ ობიექტებია, ისინი შეიძლება სიმბოლოს მიებას (მიენიჭოს ცვლადს):

user=> (def plus-one
     (fn [x] (+ x 1)))
#'user/plus-one

user=> (plus-one 9)
10

ფორმა defn სინამდვილეში არის მაკროსი, რომელსაც თავისი შიგთავსი გადაჰყვანს def + fn კომბინაციაში.

თითქმის ყველა ფორმას Clojure-ში აქვს ჩადგმული დოკუმნეტაცია. თუ გინდათ სწრაფად გაიგოთ მეტი ფორმის შესახებ ინფორმაცია, გადაეცით ფორმის სახელი doc ფორმში:

user=> (doc first)
-------------------------
clojure/first
([coll])
  Returns the first item in the collection. Calls seq on its
    argument. If coll is nil, returns nil.
nil

ფუნქციის დოკუმენტირება

რედაქტირება

არსებობს ფუნქციის დოკუმენტირების რამოდენიმე გზე. აი უმარტივესი:

user=> (defn plus-one
  "Returns a number one greater than x" 
  [x]
  (+ x 1))
#'user/plus-one

user=> (doc plus-one)
-------------------------
user/plus-one
([x])
  Returns a number one greater than x
nil

აი მეორე საშუალებაც:

user=> (defn plus-one
  {:doc "Returns a number one greater than x"}
  [x]
  (+ x 1))
#'user/plus-one
user=> (doc plus-one)
-------------------------
user/plus-one
([x])
  Returns a number one greater than x
nil