グーグルで調べてみると、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
キーワードを使用することであることを理解しています。最初にすべての変数を1つのブロックで定義するのは非現実的ではありませんか、それともいくつかの重要なポイントが欠けていますか?