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

Clojure从函数返回简单的true或false,clojure,Clojure,我是新来Clojure的,我对它的基础知识有困难。我试图编写一个简单的if-else程序,并在递归中使用它,但我在语法方面遇到了问题。Java中的代码是: if(a > 0 && b >0){ return true; }else{ return false; } clojure中的代码应为: (defn checkPositiveNumber [x y] (if (and (> x 0) (> y 0))

我是新来Clojure的,我对它的基础知识有困难。我试图编写一个简单的if-else程序,并在递归中使用它,但我在语法方面遇到了问题。Java中的代码是:

if(a > 0 && 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 && b >0){
       System.out.println("Values are Positive");
       return true;
    }else{
      System.out.println("Some Values are Negative");
      return false;
    }

clojure中没有类似的
return
。Clojure函数体是表达式,因此您需要对函数进行组织,以便针对每种情况计算为
true
false

在这种情况下,如果,则根本不需要使用

(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)))

为了进一步说明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?))

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

(defn capital? [city]
  (cond
    (= city :London)
    true
    :else
    false))
简化和更好的版本是:

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

但是如果我需要编写java等价代码:if(a>0和b>0){sout(“所有值都是正数”);return true;}else{sout(“有一个负值”);return false;}@heman123-那么在每个分支中使用
if
do
。但是在打印完语句后,我想返回true和false。如何做到这一点?我还是不明白。我将根据这一点编辑我的问题。。你能推荐相应的编辑吗?非常感谢@Lee。。我能像你说的那样做。。。clojure真的很难吗?还是只有我觉得很难?@heman123-clojure与java有很大的不同,可能需要一些时间来适应,但我认为学习函数式语言也会改善你用其他语言(包括java)编写的方式。你的java没有编译:
不是运算符。我想您打算使用
&&
操作符,并相应地编辑了您的问题。这是更多的伪代码,供我在Java中实现的参考。写了很多clojure代码,混合了Java的语法。。。。。而且,与Clojure一样,您的原始Java可以缩短为
returna>0&&b>0