Clojure从函数返回简单的true或false
我是新来Clojure的,我对它的基础知识有困难。我试图编写一个简单的if-else程序,并在递归中使用它,但我在语法方面遇到了问题。Java中的代码是: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))
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
。