带有多个 if 语句的 clojure

标签 clojure

当我调用 math() 函数到“时间”时,REPL 返回 nil。当我使用“添加”时,它工作正常......帮助!

(defn math [opr x y ]
    (if(= opr "times")
        (* x y)
    )
    (if(= opr "add")
        (+ x y)
    )
)
(math "times" 8 8)

最佳答案

问题是你的函数是两个子句的序列 if -形式。

  • Clojure 依次执行序列的元素,返回
    最后的结果。
  • 如果条件失败,则为两个子句 if -form 返回 nil .

  • 最快的修复是,as WeGi suggested , 嵌套 if s:
    (defn math [opr x y]
      (if (= opr "times")
        (* x y)
        (if (= opr "add")
          (+ x y))))
    

    但是,还有更好的方法:
    (defn math [opr x y]
      (case opr
        "add" (+ x y)
        "times" (* x y)))
    

    ...而且,将 C/Java 习惯用法抛在脑后,...
    (defn math [opr x y]
      ((case opr
         "add" +
         "times" *)
       x y))
    

    ... 或者 ...
    (defn math [opr x y]
      (({"add" +, "times" *} opr) x y))
    

    关于带有多个 if 语句的 clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681374/

    相关文章:

    function - Mapcat 是如何工作的?

    clojure - Clojure 中的线程本地计数器

    clojure - 如何使 clojure 程序结构更容易识别?

    java - 适用于带参数的 Clojure 函数的 Java 类型?

    postgresql - 当一行有一个外键到另一行时,如何原子地写入两行?

    clojure - Clojure 的 some-> 宏的实际使用示例

    Clojure - 获取向量向量内的数据

    clojure - 在clojure中向 map 添加类型的最简单方法

    java - 以编程方式使用硬件随机数生成器

    clojure - 使用 Clojure 和 Ring 的静态文件