具有多个if语句的clojure

时间:2014-02-10 15:34:48

标签: clojure

当我调用math()函数时,“times”,REPL返回nil。当我使用“添加”时,它工作得很好......帮助!

(defn math [opr x y ]
    (if(= opr "times")
        (* x y)
    )
    (if(= opr "add")
        (+ x y)
    )
)
(math "times" 8 8)

4 个答案:

答案 0 :(得分:13)

问题是你的函数是两个子句if序列 - 表单

  • Clojure依次执行序列的元素,返回 最后的结果。
  • 如果条件失败,则两个子句if - 表单将返回nil

最快的修复是as WeGi suggested,以嵌套if

(defn math [opr x y]
  (if (= opr "times")
    (* x y)
    (if (= opr "add")
      (+ x y))))

然而,有更好的方法:

(defn math [opr x y]
  (case opr
    "add" (+ x y)
    "times" (* x y)))

......并且,留下C / Java习语,......

(defn math [opr x y]
  ((case opr
     "add" +
     "times" *)
   x y))

......或......

(defn math [opr x y]
  (({"add" +, "times" *} opr) x y))

答案 1 :(得分:9)

我喜欢在多个条件下使用cond语句。

;; Will return nil if the cond statement fails all the predicates
(defn math [opr x y ]
  (cond (= opr "times") (* x y)
        (= opr "add") (+ x y)))

WeGi是正确的,因为Clojure将始终返回函数中的最后一个语句。

答案 2 :(得分:4)

condp在所有谓词具有相同结构时有效:

(defn my-calc
  [operator x y]
    (condp = operator
      "times" (* x y)
      "plus" (+ x y))) 

=> (var user/my-calc)
(my-calc "times" 2 3)
=> 6
(my-calc "plus" 2 3)
=> 5

答案 3 :(得分:1)

在Clojure中,最后一个声明是Return Statement。因此Clojure检查“时间”,即使它是真的,它也会检查“添加”,因为如果评估为nil,则使用“times”进行调用。哪个被退回。

您可以使用do或嵌套if语句来解决问题。