Clojure/ციკლები და იტერაციები

ქვემოთ ნაჩვენებია სამი ხერხი, თუ როგორ უნდა გავიაროთ ციკლი ინდექსით 0-დან 4-მდე (5 იტერაცია):

user=> (loop [i 0]
  (when (< i 5)
    (println i)
    (recur (inc i))))
0
1
2
3
4
nil
user=> (dorun (for [i (range 0 5)]
         (println i)))
0
1
2
3
4
nil
user=> (doseq i (range 0 5)
  (println i))
0
1
2
3
4
nil

პრიველი მაგალითი იყენებს loop ფორმას, რომელიც უზრუნველყოფს მაქსიმალურ მოქნილობას, თუმცა მოითხოვს ბევრ წერას. მეორე და მესამე მაგალითები არის თანმიმდევრობაზე იტერირების მაგალითები, რომელიც ციკლკის უფრო ხშირი მაგალითია. dorun და doseq გამოძახება ზღუდავს შემადგენელი ოპეტატორების მიერ მნიშვნელობის დაბრუნების შესაძლებლობას.

მოდით შევხედოთ loop ფორმას უფრო ახლოდან:

user=> (loop [i 0]
  (when (< i 5)
    (println "i:" i)
    (recur (inc i))))
i: 0
i: 1
i: 2
i: 3
i: 4
nil

ამ მაგალითში დროებითი სიმბოლო i მიბმულია მნიშვნელობაზე 0. when გამოსახულება უყურებს, ეს მნიშვნელობა არის თუ არა 5-ზე ნაკლები. თუ ტესტი წარმატებულია, შიდა ორი გამოსახულება სრულდება. println გამოსახულება ბეჭდავს i-ს მნიშვნელობას. შემდეგ, recur სრულდება, რომელიც ავალებს ციკლს შესრულდეს კიდევ ერთხელ, i-ს ახალი მნიშვნელობით. (inc i) არის (+ i 1)-ს შემოკლება.

recur-ის გარეშე, loop გამოსახულება ზუსტად ისევე იქცევა, როგორც შესაბამისი let გამოსახულება.