2012-04-09 20 views
5

Yuvalama #,% 'nın kötü olduğunu biliyorum - ancak, genellikle kendimi tam olarak 2 seviyeli # /%' si olan kısa, çevrimiçi anonim işlevler yazarken buluyorum.clojure makroları içinde # /% iç içe yerleştirme

Bu yüzden, merak ediyorum, her% 'nin en yakın (en küçük sınırlayıcı) # ile bağlandığı bir şeyi clojure söylemenin bir yolu var mı?

Teşekkürler!

+1

aynı şeyi yapar, ama sorunun ne olduğunu tam olarak anlayamıyorum. Lütfen açıklığa kavuşturabilir misiniz? Muhtemelen daha yararlı bir cevap almanıza yardımcı olacaktır. –

cevap

6

İsimsiz işlevlerin yuvalanması clojure içinde desteklenmez.

Düzenleme: "Anonim işlevler" ile , (fn ...) değil. Karışıklık için özür dilerim.

+5

'(((fn [x] (fn [y] [x y])) 1) 2)' – danlei

+5

danlei gösterileri kadar doğru değil. Anonim işlevler için # (...) okuyucu makrosunun iç içe kullanımı desteklenmez; 'fn' kullanarak yuvalama iyidir. – Gert

+2

Evet, tabiki. Yorumum, sorunun konusu olan okuyucu makrosuna yönlendirildi. –

8

İç içe geçmiş anonim işlevlere sahip olmak çok iyi. Kısa olmayan söz dizimini kullanmanız yeterlidir.

#(foo (bar %1) 
     (baz %2)) 

tam varyantı isteğe bağlı olarak iç içe olabilir

(fn [x y] 
    (foo (bar x) 
     (bax y))) 

eşdeğerdir. Ayrıca, eğer map çok fn ile kullanma eğiliminde, (Bence daha net bakmak eğilimindedir olan) yerine for kullanmayı düşünün:

(map (fn [row] 
     (map (fn [col] 
       (+ (* 10 row) col)) 
      (range 3))) 
    (range 3)) 

iki kez bunu okuyun
(for [row (range 3)] 
    (for [col (range 3)] 
    (+ (* 10 row) col)))