2010-10-25 23 views
14

Başka bir soruya verilen yanıtta, Setting Clojure "constants" at runtime klojure işlevi constantly kullanılır.'Sürekli' clojure'da ne zaman kullanılmalı, argümanları nasıl ve ne zaman değerlendiriliyor?

constantly tanımı şöyle görünür:

(defn constantly 
    "Returns a function that takes any number of arguments and returns x." 
    {:added "1.0"} 
    [x] (fn [& args] x)) 

doc dize ne yaptığını söylüyor ama kimse bunu kullanan neden. Sürekli olarak kullanıldığı önceki soruya verilen cevap olarak

aşağıdaki gibidir:

(declare version) 

(defn -main 
    [& args] 
(alter-var-root #'version (constantly (-> ...))) 
(do-stuff)) 

Yani sürekli döndürdüğü fonksiyon doğrudan sonucu için değerlendirilir. Bunun nasıl yararlı olduğu konusunda kafam karıştı. Muhtemelen x'un 'sürekli' olarak sarılmadan nasıl değerlendirileceğini anlayamıyorum.

constantly'u ne zaman kullanmalıyım ve neden gereklidir?

cevap

10

Bir API bir işlev beklediğinde ve yalnızca bir sabit kaldığında constantly işlevi yararlıdır. Bu, soruda verilen örnekte durumdur.

alter-* işlevlerinin çoğu (alter-var-root dahil olmak üzere), çağıranın eski değerine göre bir şeyi değiştirmesine izin vermek için bir işlev alır. Yeni değerin 7 olmasını (eski değeri göz ardı etmemek) isteseniz bile, bir işlev sağlamanız gerekir (sadece 7'yi değerlendirmek, bunu değerlendirme girişimi ile sonuçlanır, bu da başarısız olur). Dolayısıyla, sadece 7 değerini döndüren bir işlev sağlamanız yeterlidir. (constantly 7) sadece bu işlevi üretir ve bunu tanımlamak için gereken çabayı harcar.

Düzenleme: Sorunun ikinci kısmına gelince, constantly normal bir işlevdir, bu nedenle argümanı, sabit işlev oluşturulmadan önce değerlendirilir. (constantly @myref), myref tarafından başvurulan değeri her zaman daha sonra değiştirilse bile constantly çağrıldığında döndürür.

İlgili konular