如何翻译以下代码?
while ((readInteger = fileInputStream.read()) != -1) { ..... }
在clojure?我需要在代码的其他部分中使用readInteger的值,但是'!= -1'需要在while条件内进行.
一些用于使事物适应Clojure语法的一般模式
移动(
到函数或操作符的左侧.
将操作员移动到他们工作的东西的左边并围绕着 ( )
所以你可以这样开始:
(while (not= (.read fileInputStream) -1 ... and so on.
然后,因为您需要readInteger
在代码中稍后使用该值,所以我们将讨论命名值和循环.如果您只想读取一次值并为其命名,则可以这样做:
(let [readInteger (.read fileInputStream)] ... your code here)
既然你想在循环中完成它,那么让我们使用loop
而不是let:
(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 ...)
用于生成结果序列,而不是像在其他语言中那样循环.
然后,clojuring的下一步是考虑如何分割读取数据来处理它.我们可以:
制作所有数据的序列
处理每个数据
这样的事情:
(let [data (line-seq fileInputStream)] (map #(Integer/parseInt %) data) ...)
标准库中有一些函数可以将很多东西转换成序列,还有一些函数可以用序列来完成很多事情.