评估if表达式,然后在Clojure中返回相同的评估(如果为false)

时间:2015-12-07 10:26:28

标签: clojure

我想评估一个from in if绑定clojure,如果它返回false,那么我想返回评估。

例如

(defn testa [testvalue](let [tval testvalue]
                    (assert (validate tval) "incorrectvalue")
                    (if (= (+ 4 tval) 8)
                      1
                      (+ 4 tval))))

所以这里验证是一个验证某些标准的函数但是之后如果表达式导致为假,那么我将返回相同表达式的相同结果,如果绑定我将在其中进行调整。但我想避免再次写入。

我该怎么做?

更正: - 我还想在验证之前对tval执行操作。

(defn testa [testvalue]
(let [tval (trim testvalue)] 
(assert (validate tval) "incorrectvalue") 
(if (= (+ 4 tval) 8) 
1 
(+ 4 tval))))

谢谢!

2 个答案:

答案 0 :(得分:1)

尼尔

我重构并简化以达到您想要的结果。

(defn testa [testvalue]
  (assert (validate testvalue) "incorrect value")
  (let [tval (+ 4 testvalue)]
    (if (= tval 8)
      1
      tval)))

答案 1 :(得分:1)

只是为了好玩:

(defn testa [testvalue]
  (assert (validate testvalue) "incorrectvalue")
  (as-> (+ testvalue 4) v
        (if (== v 8) 1 v)))

在repl中:

user=> (testa 10)
14
user=> (testa 4)
1

upd:根据op对另一个答案的评论进行更新。

假设您使用prepare函数以某种方式准备您的测试值。然后整个函数可能如下所示:

(defn testa [testvalue]
  (as-> (prepare testvalue) v
        (do (assert (validate v) "incorrectvalue")
            v)
        (+ v 4)
        (if (== 8 v) 1 v)))

它的工作原理如下:

v = prepare(testvalue);
assert(validate(v), "incorrectvalue");
v = (+ v 4);
if (v == 8)
  return 1;
else
  return v;