当我调用math()函数时,“times”,REPL返回nil。当我使用“添加”时,它工作得很好......帮助!
(defn math [opr x y ]
(if(= opr "times")
(* x y)
)
(if(= opr "add")
(+ x y)
)
)
(math "times" 8 8)
答案 0 :(得分:13)
问题是你的函数是两个子句if
的序列 - 表单。
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语句来解决问题。