查看部分数据在clojure中是否是惰性的

时间:2012-03-28 22:02:06

标签: clojure lazy-evaluation lazy-sequences

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

背景

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

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

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

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

2 个答案:

答案 0 :(得分:3)

通过使用doall

强制进行评估,可以更轻松地确保它不会变得懒惰

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

答案 1 :(得分:1)

你可以用doall强制进行评估,因为Arther明智地建议。

但是我建议改为解决实际问题,即你的处理函数有副作用(从输入读取,写入输出)。

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

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

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