如何在Clojure函数中包含多个if语句?

时间:2014-10-17 02:19:35

标签: clojure

我想在Clojure中这样做:

int i=1;j=2;k=3;
str r;
cin>>r;
if(r=="A")
cout<<i; (i.e., print 1)
if(r=="J")
cout<<j; (i.e., print 2)
if(r=="K")
cout<<k; (i.e., print 3)
else
do something else

我在clojure中这样做:

(defn str-to-num [c]
    (if ( = (str (first c )) "A")
        1
    (java.lang.Integer/valueOf (str (first c))))

(if ( = (str (first c )) "J")
        2
    (java.lang.Integer/valueOf (str (first c))))

(if ( = (str (first c )) "K")
        3
    (java.lang.Integer/valueOf (str (first c))))

)

但是,我收到了一个错误。有人能说出我做错了吗?

2 个答案:

答案 0 :(得分:2)

所有if块都是一个接一个地运行,无论它们返回什么。如果你想if / else / chaining,你应该使用condcase(尽管如果只有两个选项,标准的两个分支可以正常工作)。

你的前两个if if除了抛出错误外无法做任何有意义的事情。这正是大多数投入会发生的事情。

“A”,“J”和“K”不是有效数字,因此尝试解析它们会引发错误。

这个函数可以做的唯一有意义的事情是将字符串的第一个字母作为数字返回,如果它可以解析为一个。

user> (str-to-num "A")
NumberFormatException For input string: "A"  java.lang.NumberFormatException.forInputString (NumberFormatException.java:65)
user> (str-to-num "J")
NumberFormatException For input string: "J"  java.lang.NumberFormatException.forInputString (NumberFormatException.java:65)
user> (str-to-num "K")
NumberFormatException For input string: "K"  java.lang.NumberFormatException.forInputString (NumberFormatException.java:65)
user> (str-to-num "100")
1

也许你想要这样的东西:

user> (defn str-to-num [c]
        (case (first c)
              \A 1
              \J 2
              \K 3
              (int (first c))))
#'user/str-to-num
user> (str-to-num "A")
1
user> (str-to-num "J")
2
user> (str-to-num "K")
3
user> (str-to-num "L")
76
user> (str-to-num "☃")
9731

可替换地:

user> (defn str-to-num [c]
        (case (first c)
              \A 1
              \J 2
              \K 3
              (Integer/parseInt (subs c 0 1))))
#'user/str-to-num
user> (str-to-num "9")
9

答案 1 :(得分:1)

问题在于你的if语句

的形式

你有

(if ( = (str (first c )) "A")
    1
(java.lang.Integer/valueOf (str (first c))))

if的形式是

(if (cond)
    trueResult
    falseResult)

因此,如果输入A,则“工作版本”将返回1.如果输入任何其他字符串,则实际上会引发错误。但是,如果没有抛出错误,则将执行所有三个if语句,并且实际返回最后一个语句的结果。

这更接近您的C ++代码:

(defn str-to-num [c]
    (if ( = (str (first c )) "A") (print 1))
    (if ( = (str (first c )) "J") (print 2))
    (if ( = (str (first c )) "K") (print 3)))