[英]Clojure While Loop
我正在尝试clojure我试图弄清楚如何实现以下算法,
我正在从输入流中读取内容,我想继续读取直到它不是分隔符为止。
我可以使用while循环在Java中执行此操作,但是我似乎无法弄清楚如何在clojure中执行此操作?
while read readChar != delimiter do some processing.... end while
我不了解Clojure,但看起来像Scheme一样,它支持“ let循环”:
(loop [char (readChar)]
(if (= char delimiter)
'()
(do (some-processing)
(recur (readChar)))))
希望这足以让您入门。 我参考了http://clojure.org/special_forms#toc9来回答这个问题。
注意:我知道Clojure会阻止副作用,因此大概您想返回有用的东西而不是'()。
在Clojure 1.3.0上工作,以及它的价值,您可以通过执行类似于以下操作的方式在Clojure中编写while循环
(while truth-expression
(call-some-function))
循环方法在clojure中可以很好地工作,但是循环/重复被认为是低级操作,通常首选高阶函数。
通常,可以通过创建令牌序列(示例中的字符)并在clojure的序列函数(doseq,dorun,take-while等)中应用一个或多个来解决此类问题。
以下示例在类似unix的系统上从/ etc / passwd读取第一个用户名。
(require '[clojure.java [io :as io]])
(defn char-seq
"create a lazy sequence of characters from an input stream"
[i-stream]
(map char
(take-while
(partial not= -1)
(repeatedly #(.read i-stream)))))
;; process the sequence one token at a time
;; with-open will automatically close the stream for us
(with-open [is (io/input-stream "/etc/passwd")]
(doseq [c (take-while (partial not= \:) (char-seq is))]
;; your processing is done here
(prn c)))
我本着line-seq
提出了这一点。 它完全是懒惰的,比loop
具有更多Clojure的功能特性。
(defn delim-seq
([#^java.io.Reader rdr #^Character delim]
(delim-seq rdr delim (StringBuilder.)))
([#^java.io.Reader rdr #^Character delim #^StringBuilder buf]
(lazy-seq
(let [ch (.read rdr)]
(when-not (= ch -1)
(if (= (char ch) delim)
(cons (str buf) (delim-seq rdr delim))
(delim-seq rdr delim (doto buf (.append (char ch))))))))))
全贴 。
while循环通常涉及可变变量,即等待直到变量满足特定条件。 在Clojure中,您通常会使用tail递归(编译器将其转换为while循环)
以下内容并不是解决方案,但是for循环的这种变化在某些情况下可能会有所帮助:
(for [a (range 100)
b (range 100)
:while (< (* a b) 1000)]
[a b]
)
这将创建a和b所有对的列表, 直到 (< (* ab) 1000)
为止 。 也就是说,一旦满足条件,它将立即停止。 如果用:when替换:while,则即使找到了不符合条件的对,也可以找到所有符合条件的对。
我出来了这个版本:
(defn read-until
[^java.io.Reader rdr ^String delim]
(let [^java.lang.StringBuilder salida (StringBuilder.) ]
(while
(not (.endsWith (.toString salida) delim))
(.append salida (str (char (.read rdr))))
)
(.toString salida)
)
)
它查找字符串,而不是单个char作为定界符!
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.