Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写clojure条件语句_Clojure - Fatal编程技术网

如何编写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 +))