Clojure从函数返回简单的true或false

时间:2019-05-29 16:42:30

标签: clojure

我是Clojure的新手,我在基本知识方面遇到了麻烦。我正在尝试编写一个简单的if else程序,并在递归中使用它,但是我在语法上遇到了麻烦。 Java中的代码是:

if(a > 0 and b >0){
   return true;
}else{
  return false;
}

clojure中的代码应为:

(defn checkPositiveNumber 
    [x y]
    (if (and (> x 0) (> y 0))
            (do 
                (def val true)
            )
            (do 
                (def val false) 
    )
)

(println (checkPositiveNumber 2 3))

返回#'user/val而不是false。 我究竟做错了什么 ?该函数应该返回true或false,因为我将使用它终止我的递归或进一步检查。

编辑: 多亏了李,我才得以实现我所要求的...但是我的真正目的是:

if(a > 0 and b >0){
       System.out.println("Values are Positive");
       return true;
    }else{
      System.out.println("Some Values are Negative");
      return false;
    }

3 个答案:

答案 0 :(得分:4)

clojure中没有return的类似物。 Clojure函数主体是表达式,因此您需要组织函数以对每种情况求值为truefalse

在这种情况下,您根本不需要使用if

(defn checkPositiveNumber [x y]
  (and (> x 0) (> y 0)))

如果要在每个分支中执行某些副作用,可以使用do

(defn checkPositiveNumber [x y]
   (if (and (> x 0) (> y 0)))
     (do
       (println "x and y both positive")
       true)
     (do
       (println "One of x or y non-positive")
       false)))

答案 1 :(得分:2)

要进一步了解Lee的答案,您还可以使用every?函数使您的函数更通用:

(defn every-pos? [& values]
  (every? pos? values))

此函数的优点在于您不必指定每个参数的求值,并且它可以使用无数个参数:

=> (every-pos? 1 7)
true
=> (every-pos? 3 -1 13 2)
false

学习使用序列而不是单个值进行元编程确实证明了函数式编程的优势。

要检查该值并包括副作用,可以执行以下操作:

(defn check-positive-numbers [x y]
  (let [pos-values? (every-pos? x y)
        msg (if pos-values?
              "all numbers positive" 
              "one or more numbers non-positive")]
    (println msg)
    pos-values?))

答案 2 :(得分:0)

我也是Clojure的新手,但这是如何从函数返回true或false的示例:

(defn capital? [city]
  (cond
    (= city :London)
    true
    :else
    false))

简化和更好的版本是:

(defn capital? [city]
  (= city :London))