clojure - 如何编写clojure条件语句

标签 clojure

如何翻译以下代码

while ((readInteger = fileInputStream.read()) != -1) {
.....
}

在 clojure 中?我需要在代码的其他部分使用 readInteger 的值,但 '!= -1' 也需要在 while 条件中发生。

最佳答案

一些使事物适应 Clojure 语法的通用模式

  • 移动 (在函数或运算符的左侧。
  • 将运算符(operator)移动到他们工作的事物的左侧并用 ( ) 包围起来

  • 所以你可以这样开始:
    (while (not= (.read fileInputStream) -1 ... and so on.
    

    那么,由于您需要使用 readInteger value 稍后在代码中让我们讨论命名值和循环。如果您只想读取一次值并为其命名,您可以这样做:
    (let [readInteger  (.read fileInputStream)]
      ... your code here)
    

    既然要循环执行,那我们就用loop而不是让:
    (loop [readInteger  (.read fileInputStream)]
      ... your code here
      (if (not= readInteger -1)
        (recur (.read fileInputStream))))
    

    for (这不是其他语言的“for 循环”)
    (for [readInteger   (repeatedly #(.read fileInputStream))
          :while (not= readInteger -1)]
      ... do somethign with readInteger ...)
    

    For 生成结果序列,而不是像在其他语言中那样循环。

    然后Clojuring的下一步是考虑如何将读取数据与处理数据分开。我们可以:
  • 对所有数据进行排序
  • 处理每个数据

  • 像这样:
    (let [data (line-seq fileInputStream)]
      (map #(Integer/parseInt %) data)
      ...)
    

    标准库中有一些函数可以将很多东西转换成序列,还有一堆函数可以用序列做很多事情。

    关于clojure - 如何编写clojure条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862089/

    相关文章:

    java - Clojure 银行账户汇款示例

    clojure - lein测试时出现无效的防伪错误

    java - 从 Java 向 Clojure 传递参数

    clojure - 关系数据库语言和逻辑编程有何相似之处?

    mongodb - 如何使用 Monger 更新/插入 MongoDB 子文档?

    java - 从 Java 对象发布到 Clojure channel

    string - Clojure:为什么字符串上的 = 和 .equals 有不同的性能?

    testing - 你如何在 clojure 中使用它自己的命名空间之外的类型?

    clojure - 这个 clojure sleep 理发师解决方案中是否存在错误?

    clojure - 为什么 compojure 路由定义为宏?