2012-09-03 17 views
6

Clojure ile Başlangıç ​​Rich Hickey tarafından bir konuşma yaptı ve burada Clojure'ın bazı güçlü yönlerini Ant-Simulator numaralı telefondan gösterdi.Clojure referansı Proje güncel değil mi?

Bu kod hala Clojure için iyi bir başvuru olarak kabul edilebilir mi? Özellikle, bir oyun döngüsünü simüle etmek için aracıları işlevlere tekrar gönderdiğinde parçalar. Örnek:

(defn animation [x] 
    (when b/running 
    (send-off *agent* #'animation)) 
    (. panel (repaint)) 
    (. Thread (sleep defs/animation-sleep-ms)) 
    nil) 

Düzenleme:

Ben #' okuyucu makro ilgilenen ama yinelemeli bir ajan veya olmasın bir işlevi çağırmak için deyimsel/iyi Clojure olduğunu Hava daha değilim.

+0

Ne tür bir kod yazdırabiliriz, böylece bir sorun bildirilebilir, bu yüzden size yardımcı olabiliriz? Aksi halde, bu sorunun Programcılar'a ait olduğunu düşünüyorum. – octopusgrabbus

+0

"#", "animasyonu", "* agent *" olarak tekrarlayan bir şekilde gönderirken niçin "#" okuyucu makrosu gerekiyor? – noahlz

+2

Bu, her kullanıldığı zaman "animasyonu" değerlendirir. Bu şekilde 'animation' sineklikle değişebilir –

cevap

3

Bu kod parçacığı Clojure 1.4 sürümündedir. Bir işlevin, kendisine çağrılan aracıya geri gönderilmesi, deyimsel mi? Evet. Bir bulunduğundan,

yukarıda aslında iyi bir değil bir yapmacık bir örneğidir ve

(defn fac [n limit total] 
    (if (< n limit) 
    (let [next-n (inc n)] 
     (send-off *agent* fac limit (* total next-n)) 
     next-n) 
    total)) 

(def a (agent 1)) 

(await (send-off a fac 5 1)) 
; => nil 
@a 
;=> 120 

Güncelleme: İşte

yinelemeli bir çarpınımını hesaplamak için de benzer bir yaklaşım kullanan bir örnektir çeşitli özyinelemeli send-off çağrıları ve daha sonra await arasındaki yarış durumu. Aracın görev sırasına eklenecek bazı send-off çağrıları olabilir.

ben yeniden yazdım yukarıdaki aşağıdaki gibidir:

(defn factorial-using-agent-recursive [x] 
    (let [a (agent 1)] 
    (letfn [(calc [n limit total] 
       (if (< n limit) 
       (let [next-n (inc n)] 
        (send-off *agent* calc limit (* total next-n)) 
        next-n) 
       total))] 
     (await (send-off a calc x 1))) 
    @a)) 

ve aşağıdaki davranış gözlenen: Hikayenin

user=> (for [x (range 10)] (factorial-using-agent-recursive 5)) 
(2 4 3 120 2 120 120 120 120 2) 
user=> (for [x (range 10)] (factorial-using-agent-recursive 5)) 
(2 2 2 3 2 2 3 2 120 2) 
user=> (for [x (range 10)] (factorial-using-agent-recursive 5)) 
(120 120 120 120 120 120 120 120 120 120) 

Ahlaki geçerli: senkron hesaplamalar için maddeler kullanmayın. Bir kullanıcıya görüntülenen animasyonları güncelleme gibi senkronize olmayan bağımsız görevler için kullanın.

+0

Teşekkür ederiz @noahz –