从谷歌搜索,我发现使用while
循环或使用变量是不鼓励的。Clojure变量和循环
现在我实现了一个非常简单的算法,它将从输入流中读取字符并进行相应的解析:如果输入是10:abcdefghej
,它将解析出10
,然后读取冒号后面的10个字节。
我有点失落的东西是我如何重构这个,所以它不依赖于变量。
(defn decode-string [input-stream indicator]
(with-local-vars [length (str (char indicator))
delimiter (.read input-stream)
string (str "")
counter 0 ]
(while (not(= (var-get delimiter) 58))
(var-set length (str (var-get length) (char (var-get delimiter))))
(var-set delimiter (.read input-stream)))
(var-set length (new BigInteger (var-get length)))
(var-set counter (var-get length))
(while (not(zero? (var-get counter)))
(var-set string (str (var-get string) (char (.read input-stream)) ))
(var-set counter (dec (var-get counter))))
(var-get string)))
而且,据我所知,声明变量的唯一方法是使用with-local-vars
关键字。在一开始就定义一个区块中的所有变量是不切实际的,还是我错过了一些关键点?
如果我正确理解你的建议,我应该通过尝试组合它尽可能多地分解功能来解决问题,对吗? – 2009-06-28 17:38:46
我不会说尽可能多的,而是尽可能明智---你会发现你可以命名的概念,然后把它们封装在这个名字后面。但是,这只是上述的一个方面。 – Svante 2009-06-28 18:33:24