如何编写clojure条件语句
如何翻译以下代码如何编写clojure条件语句,clojure,Clojure,如何翻译以下代码 while ((readInteger = fileInputStream.read()) != -1) { ..... } 在clojure?我需要在代码的其他部分中使用readInteger的值,但也需要'!=-1'需要在while条件中进行。不要使用while解决此问题,while要求您在循环开始时进行测试。相反,请考虑递归函数,它可以在其体的任何部分决定是否进行递归调用。任何迭代循环都可以使用循环/递归转换为尾部递归函数;下面是一个如何使用循环的示例 (loop []
while ((readInteger = fileInputStream.read()) != -1) {
.....
}
在clojure?我需要在代码的其他部分中使用readInteger的值,但也需要'!=-1'需要在while条件中进行。不要使用while解决此问题,while要求您在循环开始时进行测试。相反,请考虑递归函数,它可以在其体的任何部分决定是否进行递归调用。任何迭代循环都可以使用
循环
/递归
转换为尾部递归函数;下面是一个如何使用循环的示例
(loop []
(let [read-integer (.read file-input-stream)]
(when (not= read-integer -1)
(...)
(recur))))
使事情适应Clojure语法的一些通用模式
(
移动到函数或运算器的左侧()
(while (not= (.read fileInputStream) -1 ... and so on.
(let [readInteger (.read fileInputStream)]
... your code here)
(let [data (line-seq fileInputStream)]
(map #(Integer/parseInt %) data)
...)
然后,因为您需要在代码后面使用readInteger
值,所以让我们讨论命名值和循环。如果您只想读取一次值并给它命名,您可以这样做:
(while (not= (.read fileInputStream) -1 ... and so on.
(let [readInteger (.read fileInputStream)]
... your code here)
(let [data (line-seq fileInputStream)]
(map #(Integer/parseInt %) data)
...)
既然您希望在循环中执行此操作,那么让我们使用loop
而不是let:
(loop [readInteger (.read fileInputStream)]
... your code here
(if (not= readInteger -1)
(recur (.read fileInputStream))))
或for
(这不是其他语言的“for循环”)
For生成结果序列,而不是像在其他语言中那样循环
然后clojuring的下一步是考虑如何将读取数据与处理数据分开。我们可以:
(while (not= (.read fileInputStream) -1 ... and so on.
(let [readInteger (.read fileInputStream)]
... your code here)
(let [data (line-seq fileInputStream)]
(map #(Integer/parseInt %) data)
...)
标准库中有一些函数用于将大量内容转换为序列,还有一些函数用于对序列执行大量操作。这里有两个类似的示例,如amalloy建议的:
(ns xyz...
(:require [clojure.java.io :as io] )
(:import [java.io StringReader] ))
(newline) (newline)
(let [reader-2 (io/reader (StringReader. "first")) ]
(loop []
(let [curr-char-int (.read reader-2)]
(when (not= -1 curr-char-int)
(print (char curr-char-int) " ")
(recur)))))
(newline) (newline)
(let [reader-2 (io/reader (StringReader. "second")) ]
(loop [curr-char-int (.read reader-2)]
(when (not= -1 curr-char-int)
(print (char curr-char-int) " ")
(recur (.read reader-2)))))
结果:
> lein run
f i r s t
s e c o n d
在第一种情况下,它需要一个额外的let
语句,但不会像第二种情况那样复制零件(.read reader-2)
。使用线程宏:
(->> (repeatedly #(.read fs))
(take-while (partial not= -1))
(map str))
用您想要操作的任何函数替换(map str)
在流上。例如,要计算总和:
(->> (repeatedly #(.read fs))
(take-while (partial not= -1))
(reduce +))