gpt4 book ai didi

Clojure:从输入流创建字节 block 的惰性序列

转载 作者:行者123 更新时间:2023-12-02 12:09:47 24 4
gpt4 key购买 nike

给定一个输入流,我想以字节数组( block )的形式创建一个惰性数据序列。这是我的尝试:

(defn- read-or-nil [stream]
(let [buf (byte-array 2)]
(when-not (= -1 (.read stream buf))
buf)))

(defn byte-chunk-seq [stream]
(cons (read-or-nil stream) (lazy-seq (byte-chunk-seq stream))))

(with-open [rdr (java.io.FileInputStream. "/tmp/wut")]
(take 2 (byte-chunk-seq rdr)))

在最后一个语句中,我正在测试代码,我得到:

IOException 流已关闭 java.io.FileInputStream.readBytes (FileInputStream.java:-2)

如果我将语句更改为 take 1 那么它会返回正常,但这对我没有多大帮助。有谁知道为什么这行不通?

最佳答案

有几个问题。

首先,您的惰性序列并不完全正确。函数的整个主体应该包裹在lazy-seq中,并且应该传入cons来继续序列,或者传递nil来终止序列。

(defn byte-chunk-seq [stream]
(lazy-seq (if-let [buf (read-or-nil stream)]
(cons buf (byte-chunk-seq stream))
nil)))

其次,take也是懒惰的。因此,直到 with-open 关闭流之后,惰性序列才会实现。您可以通过在惰性序列周围包装 doall 来避免此错误,以在流关闭之前实现它。

(with-open [rdr (java.io.FileInputStream. "/tmp/wut")]
(doall (take 2 (byte-chunk-seq rdr))))

关于Clojure:从输入流创建字节 block 的惰性序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com