Я бы, вероятно, лично использовал aget / aset / areduce здесь - они могут быть необходимыми, но они полезны при работе с массивами, и я не нахожу их особенно уродливыми.Если вы хотите обернуть их в красивую функцию, то, конечно, вы можете: -)
Если вы решили использовать последовательности, то ваша проблема будет в построении и обходе seq, так как это потребует созданияи хранение нового объекта seq для каждого байта в массиве.Это, вероятно, ~ 24 байта для каждого байта массива ......
Так что хитрость заключается в том, чтобы заставить его работать лениво, и в этом случае более ранние объекты будут собираться мусором до того, как вы доберетесь до конца.массив.Однако, чтобы это сработало, вам нужно избегать удержания какой-либо ссылки на начало последовательности при прохождении последовательности (например, с помощью счетчика).
Следующее может работать (не проверено), но будет зависеть от того, что write-bin-file реализован дружественным образом:
(defn remove-cr-from-file [file]
(let [dirty-bytes (read-bin-file file)
clean-bytes (filter #(not (= 13 %)) dirty-bytes)
changed-bytes (count (filter #(not (= 13 %)) dirty-bytes))
changed? (< changed-bytes (alength dirty-bytes))]
(if changed?
(write-bin-file file clean-bytes))))
Обратите внимание, что это по сути то же самое, что и ваш код, но создает отдельную ленивую последовательность для подсчета количества измененных байтов.