填充序列的习语

Jeg*_*sch 9 sequences clojure

要填充具有某些值的序列,这就是我想出的:

(defn pad [n coll val]
  (take n (concat coll (repeat val))))

(pad 10 [1 2 3] nil)   ; (1 2 3 nil nil nil nil nil nil nil)
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有一个较短的成语,已经这样做,也许更有效率.

Art*_*ldt 9

是的,这是一个关于序列的填充分区的惯用方法.事实上,该代码与clojure.core中的分区函数的一部分非常相似,不同之处在于partition不假设单个填充值而是要求序列:

core.clj:

([n step pad coll]
 (lazy-seq
    ...
    (list (take n (concat p pad))))))))
Run Code Online (Sandbox Code Playgroud)

通过将填充集合传递给分区,可以获得相同的结果:

user> (defn pad [n coll val]
        (take n (concat coll (repeat val))))
#'user/pad
user> (pad 10 [1 2 3] nil)
(1 2 3 nil nil nil nil nil nil nil)

user> (first (partition 10 10 (repeat nil) [1 2 3]))
(1 2 3 nil nil nil nil nil nil nil)
Run Code Online (Sandbox Code Playgroud)