能否用Common Lisp Series的map-fn替代mapping处理块?
问题解答
你的方案不可行,原因如下:
(chunk 14 1 stream)生成的流中,每个元素是长度为14的字符序列,而非14个独立的字符参数。map-fn会直接将每个完整的chunk序列作为单个参数传给你的lambda,因此&rest xs只会收到这一个序列值,而非14个拆分后的字符。
而你最初用mapping能正常工作,是因为Series的mapping支持模式解构语法:((a b c ... n) (chunk ...))会自动把每个chunk的14个元素拆分为14个独立变量,再传递给后续表达式——map-fn没有这个自动解构的能力。
正确的替代实现
可以在map-fn的lambda内部直接处理整个chunk序列,通过判断序列内元素是否全唯一来实现逻辑,示例如下:
(series::defun find-14-character-marker (stream) (declare (optimizable-series-function)) (declare (off-line-port stream)) (->> (chunk 14 1 stream) (map-fn t (lambda (chunk) ;; 通过去重后长度判断是否所有字符唯一 (= (length (remove-duplicates chunk)) 14))) (until-if #'identity) (collect-length)))
如果追求更高效率(避免创建去重后的序列),可以用every结合位置检查:
(lambda (chunk) (every (lambda (char index) ;; 检查当前字符在后续位置是否重复出现 (not (position char chunk :start (1+ index)))) chunk (series::scan-range :length 14)))
内容的提问来源于stack exchange,提问作者Maris Orbidans
相关产品推荐
相关产品推荐

