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
გამოსახულება.