2016-05-19 1 views
3

Clojureの関数アプリケーションの動作をオーバーライドすることはできますか? clojure:override function application

(+ 2 2) 

のようなマクロを介して定 5と評価:

(defmacro app [& args] 5) 
+0

マクロ 'app'と'(+ 2 2) 'の間に必要な関係を指定しません。あなたがしようとしていることを正確に明確にしてください。 –

+0

マクロ 'app'がネームスペース内のすべての関数アプリケーションの動作を変更したいと思います。関数 'f'には'(+ 2 2) 'と'(+ 1 2 3) 'と'(f x) 'も含まれます。 –

答えて

2

+だけ機能がために、あなたができるので、ここで

たとえば私は、名前空間を作りたいのですがあなたの名前空間は、clojure.core/+を参照して除外し、その名前空間に独自の加算関数を定義します。

Clojureは、この名前空間での関数アプリケーションの概念の一般的なフックを提供していません。開発ツールが行うことは、関数を含むすべてのシンボルの名前空間を読み取ってから、トレースを行うラッピング関数でフックします。これは、このときに名前空間に存在する関数にのみ影響するので、あなたが求めているものよりも一般的ではありません。

clojure.tools.traceおよびRobert Hookeを参照してください。

+1

それは素晴らしいですが、アプリケーションを無効にすることはできますか? –

+0

ここでアプリケーションを言うときに関数を呼び出す効果以外の何かを意味しますか?おそらく望ましい出力を持つ例がわかります –

+1

どこの関数呼び出しの振る舞いを変更できるか尋ねていますか? –