【问题标题】:Clojure: function will not return rightClojure:函数不会正确返回
【发布时间】:2017-10-03 13:50:46
【问题描述】:
    (defn foo [n]
      (if (== 1 n)
        true
        )
      false
      )

    (if (true? (foo 1))
         (println "true")
         )
    (if (false? (foo 1))
      (println "false")
      )

这总是返回 false,我假设在 clojure 中它只返回我在函数中写的最后一件事。当 if 条件满足时,如何打破循环并返回一些东西?

【问题讨论】:

  • 将 true 后的括号移动到 false 后:(if (== 1 n) true false)。还建议使用支持格式的编辑器,这真的很难阅读(这可能是您自己没有注意到问题的原因)。
  • 查看 IntelliJ+Cursive。如上所述,这是一个支撑问题,任何代码格式都会使这一点变得明显。此外,这里没有循环。
  • 还要注意 foo 等价于(partial = 1)
  • 在 Clojure 中,您不会跳出循环;你用recur再次闯入它。

标签: clojure


【解决方案1】:

if 宏具有以下格式:

(if conditional-expression return-for-true return-for-false)

你的代码是这样写的:

(if conditional-expression return-for-true) return-for-false

注意放错位置的括号。另请注意,除非条件表达式是函数调用,否则不需要括号。

您的 foo 函数,如所写,计算两个表达式 (if ...)false 并可以预见地返回最后一个计算的表达式,它只是文字 false。有关正在发生的事情的更简短且可能更容易理解的示例,请考虑以下内容:

(defn foo [n] (+ 3 n) 4)

调用此函数将始终返回 4:加法表达式要么被计算,要么不被编译器使用或优化掉。

【讨论】:

  • (conditional-expression) 周围有多余的括号。就像 thenelse 分支一样,条件没有装饰性括号。
  • @amalloy 进行了澄清编辑。之所以这样写,是因为在原始问题中,条件表达式是一个函数调用。
  • 编辑参考if操作符,它不是一个函数。
  • @Thumbnail 有什么区别?我的印象是,作为 LISP 方言,if 是一个函数并在列表中占据“函数位置”。
  • @JaredSmith 我遵循Clojure Evaluation 页面的术语:非空列表被视为对特殊形式、宏或函数的调用。调用的形式为(运算符操作数*)。 碰巧,if 是一种特殊形式。它当然不是一个函数,因为它的操作数可能不会全部被计算。我相信其他 Lisp 使用类似的术语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多