通过谷歌搜索,我发现使用while
循环或使用变量是不鼓励的。
现在我实现了一个非常简单的算法,它将从输入流中读取字符并进行解析:如果输入为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
关键字。这种方式是否有些不切实际,在开头定义所有变量,或者我错过了一些关键点?