如何编写clojure条件语句

lek*_*kki 3 clojure

如何翻译以下代码?

while ((readInteger = fileInputStream.read()) != -1) {
.....
}
Run Code Online (Sandbox Code Playgroud)

在clojure?我需要在代码的其他部分中使用readInteger的值,但是'!= -1'需要在while条件内进行.

Art*_*ldt 6

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

  1. 移动(到函数或操作符的左侧.
  2. 将操作员移动到他们工作的东西的左边并围绕着 ( )

所以你可以这样开始:

(while (not= (.read fileInputStream) -1 ... and so on.
Run Code Online (Sandbox Code Playgroud)

然后,因为您需要readInteger在代码中稍后使用该值,所以我们将讨论命名值和循环.如果您只想读取一次值并为其命名,则可以这样做:

(let [readInteger  (.read fileInputStream)]
  ... your code here)
Run Code Online (Sandbox Code Playgroud)

既然你想在循环中完成它,那么让我们使用loop而不是let:

(loop [readInteger  (.read fileInputStream)]
  ... your code here
  (if (not= readInteger -1)
    (recur (.read fileInputStream))))
Run Code Online (Sandbox Code Playgroud)

for(不是其他语言的"for循环")

(for [readInteger   (repeatedly #(.read fileInputStream))
      :while (not= readInteger -1)]
  ... do somethign with readInteger ...)
Run Code Online (Sandbox Code Playgroud)

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

然后,clojuring的下一步是考虑如何分割读取数据来处理它.我们可以:

  1. 制作所有数据的序列
  2. 处理每个数据

这样的事情:

(let [data (line-seq fileInputStream)]
  (map #(Integer/parseInt %) data)
  ...)
Run Code Online (Sandbox Code Playgroud)

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