2010-11-21 12 views
7

Clojureにdefという名前で新しいマクロを定義する方法はありますか? I defmacro:refer-clojure :exclude元にしようとした後に新しいものを編集しましたが、とにかくそれは組み込みの定義を使用しました。Clojureで "def"を再定義する

私はSchemeスタイルの関数定義((def (f x y) ...)(defn f [x y] ...)とする)を次のコードを使用して有効にしようとしていました。

(defmacro def 
    [ id & others ] 
    (if (list? id) 
     `(defn ~(first id) [[email protected](rest id)] [email protected]) 
     `(def ~id [email protected]))) 

答えて

6

defはマクロではありません。特別な形式です。シンボルを現在の名前空間にインターンする。あなたは特別な書式を再定義することはできませんが、たとえ可能であっても、あなたはどのように同じ行動を取るでしょうか?

defineマクロをdefdefnのベースに書き込むのが最も簡単な方法です。あなたがdef言葉を使用する場合は、すなわち

(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)) 

) 

、すべてのモジュールの周りのラッパーreplace-my-def-with-normal-defを書くことができますが、私はそれがdef(例えば、defnに依存する他の定義は、中断されませんわからないんだけど)。

+4

特殊フォームを再定義することはできません。 –

2

特殊なフォームの名前(ifなど)でマクロを作成することはできますが、それは役に立ちません。特殊フォームはマクロの前に評価されるため、マクロと同じ名前の特別なフォームがある場合は、特別なフォームが常に使用されます。詳細はこちらhttp://clojure.org/evaluation

関連する問題