4

clojure 中是否有一个函数可以检查数据是否包含一些惰性部分?

背景:

我正在用clojure构建一个小型服务器。每个连接都有一个状态、一个输入流和一个输出流

服务器从输入流中读取一个字节,并根据该值调用几个函数之一(以状态以及输入和输出流作为参数)。这些函数可以决定从输入流中读取更多内容,向输出流写入回复,并返回一个状态。这部分循环。

只要状态不包含任何惰性部分,这一切都会正常工作。如果状态中有一些惰性部分,那么当它被评估时(稍后,在另一个函数期间),可能会开始从输入流读取并写入输出流。

所以基本上我想为所有这些函数添加一个后置条件,说明返回状态的任何部分都不能是惰性的。有没有检查惰性序列的函数。我认为检查状态本身是否是惰性序列很容易,但我想检查例如状态是否具有包含哈希映射的向量,其中一个值是惰性的。

4

2 回答 2

3

通过强制评估更容易确保它不是懒惰的doall

几年前,我在一个流处理加密应用程序中遇到了这个问题,并尝试了几种方法,直到我最终接受了我的惰性方面并将输入流包装在一个惰性序列中,当没有更多数据可用时,该序列在输入流中关闭。有效地将关闭流的关注与对流包含的内容的关注分开。您正在跟踪的状态听起来比打开与关闭要复杂一些,尽管您可以以类似的方式将其分开。

于 2012-03-28T22:12:16.487 回答
1

正如 Arther 明智地建议的那样,您当然可以强制使用doall进行评估。

但是,我建议改用重构来解决真正的问题,即您的处理程序函数具有副作用(从输入读取,写入到输出)。

如果您执行以下操作,则可以改为将其转换为纯函数:

  • 将输入流包装为惰性序列
  • 使用 [input-sequence state] 作为处理函数的输入
  • 使用 [list-of-writes new-state rest-of-input-sequence] 作为输出,其中写入列表是随后需要写入输出流的任何内容

如果你这样做,你的处理函数是纯的,你只需要在一个简单的循环中运行它(在每次迭代中将写入列表发送到输出流),直到所有输入都被消耗和/或其他一些终止条件是到达。

于 2012-03-29T02:05:53.997 回答