2012-04-05 31 views
11

clojure, ortak lisp gibi güçlü bir 'döngüye' sahiptir. örneğinHer seferinde bir sıradan iki öğe alın

:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b)) 

nasıl Clojure bunu yapmanın:

bir dizisinden iki elemanlarını her zaman

Common Lisp olsun?

+1

CL clojure uygulayabilirsiniz ... –

+0

Lütfen "güçlü" yi tanımlayın. –

cevap

13

:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b)) 
+0

'for' kelimesinin döngüsel bir yapı olmadığını, ancak listeyi anlamadığını ve sonuçların tembel bir şekilde üretildiğini unutmayın. Ayrıca, Ortak LISP'nin aksine, son derece iyi performans göstermesi zordur. –

+0

@Marko - Belli örnekleriniz var mı? – sw1nn

+0

Anlama - tam olarak ne örnekleri? –

3

LOOP workalike olan cl-loop vardır ve her iki Common Lisp için iterate looping construct dayanmaktadır, hangi zamanda ve clj-iterate vardır. for yararlanarak ve bazı size özgü örneği elde edebilirsiniz kurucuların By

2

Clojure en çok amaçlı döngü yapısı for olduğunu. İçerisinde bulunan CL loop gibi pek çok özelliğe sahip değildir (özellikle Clojure işlevsel saflığı teşvik ettiği için yan etki yapanlar değildir), aksi takdirde loop ile kendi başına yapabileceğiniz pek çok işlem "etrafında" for tamamlanır. Örneğin, for tarafından oluşturulan öğeleri toplamak için, ön tarafına bir apply + koyarsınız; öğeleri çift yönlü olarak yürümek için, (sw1nn'nin gösterdiği gibi), for'a girilen girdi dizisine partition 2 kullanın.

1

Bunu loop, recur ve yıkımı ile yapardım.

=> [[1 2] [3 4] [5 6]]

a ve b birinci ve ikinci elemanlar şunlardır:

(loop [[a b & rest] [1 2 3 4 5 6] 
     result []] 
    (if (empty? rest) 
    (conj result [a b]) 
    (recur rest (conj result [a b])))) 

sonucu ile biter: Birlikte her iki değer grubuna istediği Örneğin

, sırasıyla sırayla ve daha sonra rest kalanıdır. Daha sonra rest'da hiçbir şey kalmayıncaya kadar etrafta dolaşabiliriz ve işimiz biter.

İlgili konular