【问题标题】:Clojure returning simple true or false from a functionClojure 从函数返回简单的真或假
【发布时间】:2019-10-15 08:05:19
【问题描述】:

我是 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。 我究竟做错了什么 ?这个函数应该返回真或假,因为我将使用它来终止我的递归或进一步检查。

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

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

【问题讨论】:

  • 您的 Java 未编译:and 不是运算符。我认为您打算使用 && 运算符,并相应地编辑了您的问题。
  • 那更多的是伪代码,用于参考我想在 Java 中实现的目标。写了很多 clojure 代码,混合了 Java 的语法。无论如何,谢谢..
  • ... 和 Clojure 一样,您的原始 Java 可以缩短为 return a > 0 && b > 0

标签: clojure


【解决方案1】:

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

【讨论】:

  • 但是如果我需要编写 java 等效代码: if(a > 0 and b >0){ sout("all values are positive");return true; }else{ sout("有负值");return false; }
  • @heman123 - 然后你会在每个分支中使用 ifdo
  • 但打印语句后我想返回真假。如何做到这一点?我还是不明白。我将据此编辑我的问题..您能否建议相应的编辑
  • 非常感谢@Lee ..我能按照你说的那样做到... clojure 真的很难还是只有我觉得很难?
  • @heman123 - Clojure 与 java 完全不同,可能需要一些时间来适应,但我认为学习一门函数式语言也会改善你用其他语言(包括 java)编写的方式。
【解决方案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?))

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多