從谷歌搜索,我發現使用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