2010-11-21 33 views
7

Clojure'da def adı altında yeni bir makro tanımlamak için var mı? Ben defmacro, orijinali :refer-clojure :exclude için denedikten sonra yeni bir tane edindim, ancak yine de yerleşik tanımı kullandı.Clojure içinde "def" yeniden tanımlanması

Aşağıdaki kodu kullanarak Scheme stili işlev tanımlarını ((def (f x y) ...)(defn f [x y] ...) olarak) etkinleştirmeye çalışıyordum.

cevap

6

def makro değil, özel bir formdur. Bir sembolü mevcut isim alanına dönüştürür. Özel formları yeniden tanımlayamazsınız, ancak yapabilseydiniz bile, aynı davranışı nasıl yaparsınız?

En basit yol, def ve defn tabanına define makrosu yazmaktır. Eğer def kelime kullanmak istiyorsanız, yani

(replace-my-def-with-normal-def 

    (def x 0) 
    (def y (inc x)) 
    (def z (inc y)) 
    (def (my-func a b) (println a b)) 

) 

, tüm modül etrafında sarıcı replace-my-def-with-normal-def yazabilir ama, defn örneğin (def bağlı diğer tanımları, kırmayacak emin değilim).

+4

Özel formları yeniden tanımlayamazsınız. –

2

Özel bir formun adıyla bir makro oluşturabilirsiniz (eğer varsa), ancak size yardımcı olmaz. Makrolardan önce özel formlar değerlendirilir, bu nedenle bir makronuz ve aynı ismin özel bir formu varsa, özel form her zaman kullanılır. Daha fazla bilgi burada http://clojure.org/evaluation.