Döngü için bir emrin tamamını Clojure'a çevirmenin bir yolu, for
makrosunu kullanmaktır.
(for [i (range 10)] (inc i))
yukarıdaki fonksiyon Ancak, sadece sıralı topluluğu üzerinde yineleme ve her bir öğeyi kullanmak istediğiniz görünür 1 artırılır 0'dan 9'a kadar bütün rakamları dönecektir. İhtiyacınız olan tek şey buysa, o zaman bir endeks değerine başvurmanıza gerek yoktur, bunun yerine doğrudan her bir öğeye başvurabilirsiniz. o koleksiyonlardan argümanlarla işlevleri çağırmak için tasarlandığından,
(for [d my-vec-of-data] (my-function d))
Ancak bu basit bir durum için,
map
fonksiyon muhtemelen daha iyi bir seçim olacaktır. Aşağıdaki örnek, yukarıdaki
for
kullanımına eşdeğerdir.
(map my-function my-vec-of-data)
Hem map
ve my-function
tarafından döndürülen değerlerin oluşturduğu bir değerler topluluğu dönmek for
. Bunun nedeni Clojure'un veri yapılarının değişmez olmasıdır, bu yüzden yeni bir koleksiyonun iade edilmesi gerekmektedir. İhtiyacınız olan şey bu değilse veya işlevinizin yan etkileri varsa, nil
değerini döndüren for
yerine doseq
kullanabilirsiniz.
'i' otomatik artırmaz gelmez
gerçekten Clojure içinde döngü için bir zorunluluk tarzı istiyorsanız
, bu makro ile bir tane oluşturabilirsiniz? – nuvio@nuvio: 'Dizinde değil, dizideki asıl öğe olacak. Ve evet, 'for' makrosu sizin için sıralamayı yineleyecek. – Chuck
"doseq" bir dönüş değerine gerek duymadığınız fonksiyonlar için mükemmeldir, çünkü eleman başına 1 nolu yerine tek bir sıfır döndürür – jm0