Transducers:嵌套step返回reduced时complete arity应如何处理?
有状态转换器遇到
reduced时的complete arity处理逻辑 有状态转换器通常需要在调用complete arity(即([result]))前,按需调用step arity(即([result input]))刷新状态。但如果嵌套的step arity返回reduced触发提前终止,complete arity该如何处理?
根据Clojure官方文档:
在完成步骤中,带归约状态的转换器应先刷新状态,再调用嵌套转换器的完成函数,除非之前从嵌套step收到过reduced值,此时需丢弃待处理状态。
不过文档里的“之前收到过”存在三种不同解读:
- 仍调用嵌套
steparity刷新状态; - 忽略自身状态,仅调用嵌套
completearity; - 不调用嵌套转换器的任何arity。
通过分析Clojure内置转换器的实现可以找到参考:
partition-by:符合第一种情况——在complete步骤中调用嵌套step处理剩余状态,移除reduced标记后再调用嵌套的completearity。cat:在steparity中会给reduced结果再包裹一层reduced标记;take-while:其step与completearity的逻辑看起来相互独立。
结合Rich Hickey在《Inside Transducers》中的表述:当底层函数告知提前终止时,转换器应停止积累,进入无状态可刷新的状态。那么核心疑问是:转换器遇到reduced值时,是否应该在step arity中清除积累的状态并返回reduced值,然后在complete arity中直接传递结果?
内容的提问来源于stack exchange,提问作者drRobertz
相关产品推荐
相关产品推荐

