2012-02-25 8 views
0

clojureでは、bodyの関数を作成するdefn-myマクロを書きたいと思います。この機能が実行されたとき、それは例えば0clojureでは、関数が最初の失敗で終了するようなdefnのようなマクロを書く方法はありますか?

を返さない最初の文で終了します。

(defn f1[] (println "f1") 5) 
(defn f2[] (println "f2") 0) 
(defn-my foo[] (f1) (f2))  
(defn-my bar[] (f2) (f1)) 
(foo); should execute f1 and exit 
(bar); should execute f2 and then f1 
+0

あなたDEFN、私の例で式がnullを返すことはありません。彼らはタールではなく、ヴァルスです。それは本当にあなたが意味するものですか? – user100464

+0

Thx。質問 – viebel

答えて

4

私はあなたがこのような何かを求めていると思う:

(defmacro and-zero 
    ([] true) 
    ([x] (zero? x)) 
    ([x & next] 
    `(let [and# (zero? ~x)] 
     (if and# 
     (and-not-zero [email protected]) 
     and#)))) 

user=> (and-zero 0 0 0) 
true 
user=> (and-zero 0 1 0) 
false 

マクロは、すべての式が数値に評価を前提としています。たとえば、式がnilと評価された場合、例外がスローされます。

次に、あなたがこのようなyoutはdefn-myを書き込むことができます。

(defmacro defn-my [ & body ] `(and-zero [email protected])) 
+0

Thx!あなたは私を正しくした。質問を編集して明確にすることができますか? – viebel

+0

'〜@ body'に述語を適用したい場合、どうすればいいのか教えてください。たとえば、戻り値がゼロでないときに停止するには、 '#(= 0%)'を使用します。 Thx – viebel

+0

私は '(と@body)'が好きです。しかし、私の場合、関数は0を返さない最初のステートメントで終了する必要があります。助けてください。 – viebel

1

だけandの短絡動作を活用:

(defn foo [] 
    (and (f1) (f2))) 

(defn bar [] 
    (and (f2) (f1))) 

結果:

user=> (foo) 
f1 
nil 
user=> (bar) 
f2 
f1 
nil 

最初に終了すると、非ゼロであり、orである。

+0

を更新しましたあなたの答えを更新してください。私は少し質問を修正した。 Thx – viebel

+0

また、私は 'bar'と' foo'のコードを修正する必要がないソリューションを探しています。 – viebel

+0

あなたは奇妙な質問をたくさん投稿します。おそらく、* clojure *の中で思考する方法を学ぶために、何かを解決すべきと思う方法を*あなたが*考えるために単純に曲げようとするよりも、時間を費やすべきでしょう。これに関連して、あなたが投稿したほとんどのものは、XY問題のような強く匂いがします。http://mywiki.wooledge.org/XyProblem –

関連する問題