我正在遍历一个列表,在遍历过程中构建状态,偶尔当遇到特定的标记时,我会返回结果。如果是在Python中进行这个操作,我会利用yield
惰性地生成结果,并在函数的局部范围中跟踪状态:
# this is simplified for illustration
def yielder(input_list):
state = 0
for item in input_list:
if item = 'SENTINEL':
yield state * 2
state = 0
else:
state += item
yielder([1, 5, 2, 5, 'SENTINEL', 4, 6, 7]) # [26, 34]
我的第一种实现使用了reduce
,但它不如yield
好,因为:
- 我在迭代之间传递的值既有循环状态,又有我想要生成的项,这似乎很笨拙。
- 它不是惰性的。
iterate
可以用来缓解后者,但我实际上并不想为每个输入项返回某些东西,所以它需要更多的操作。
在Clojure中做这件事的惯用方式是什么?
lazy-seq
可以给我想要的结果,如果我遇到标记时返回(cons yield-val (yielder ...))
,否则只需返回(yielder ...)
… - aaronstacy