用map-fn映射系列块



我正在使用Common Lisp Series软件包(https://series.sourceforge.net/)来编写《降临代码》。

(series::defun find-14-character-marker (stream)
(declare (optimizable-series-function))
(declare (off-line-port stream))
(->> (mapping (((a b c d e f g h i j k l m n) (chunk 14 1 stream)))
(char/= a b c d e f g h i j k l m n))
(until-if #'identity)
(collect-length)))

是否有可能使用map-fn函数而不是mapping来映射块?我可以这样做:

(lambda (&rest xs)
(apply #'char/= xs))

而无需键入所有14个参数。我尝试使用map-fn,但我的lambda函数只调用了一个参数。

chunk将其序列作为多个值返回,而map-fn要求其每个参数序列作为单独的参数。因此,(multiple-value-call #'map-fn 'boolean #'char= (chunk 14 1 stream))是您正在寻找的形式,因为它将把chunk返回的每个多个序列作为参数传递给map-fn。(#'char=被用来代替问题中给出的lambda,因为它是等价的)。

默认情况下,当一个计算多个值的形式被用作函数的参数时,除了第一个值之外的所有值都被丢弃,这可能就是为什么你最初尝试使用map-fn失败的原因。相反,multiple-value-call将表单的多个值作为单独的参数传递,这就是您在这里想要的。

最新更新