2017-11-07 19 views
0

次のコードは期待通りに動作しません。私は、fooとbarが空であるかどうかを特定し、それに応じてエラーを返すことができるようにしたい。しかし、応答はfooとbarの両方が存在する場合にのみ発生します。Clojure if(X and Y)?

私はClojureを初めて使用しています。

(defn create-entry [doc] 
    (let [id (str (java.util.UUID/randomUUID)) timestamp (quot (System/currentTimeMillis) 1000)] 
    (let [entry (assoc doc "id" id "timestamp" timestamp)] 
     (if (and (empty? [(get entry "foo") (empty? (get entry "bar")) ]) 
       (response {:err "either foo or bar is required"}) 
       ) (prn "hello!"))))) 

答えて

1

あなたは奇妙な問題を抱えています。 getへの両方の呼び出しをベクトル内にスティックし、そのハードコードされたベクトルが空であるかどうかを確認します。

私はあなたがより多くのようなものであるためにあなたの条件のためのものだと思う:

(and (empty? (get entry "foo")) 
    (empty? (get entry "bar"))) 
0

私はこれが回答されているけど、私は私がここにも何かを追加するだろうと思いました。これは、これを2つの関数、1つの述語に分割し、create-entry関数から呼び出すことで、より効果的です。

(defn entry? [entry] 
    (let [foo (get entry "foo") 
     bar (get entry "bar")] 
    (and (some? foo) 
     (some? bar)))) 

(defn create-entry [doc] 
    (let [id (str (UUID/randomUUID)) timestamp (quot (System/currentTimeMillis) 1000)] 
    (let [entry (assoc doc "id" id "timestamp" timestamp)] 
     (if (entry? entry) 
     (prn "hello!") 
     (response {:err "either foo or bar is required"})))))