2014-12-03 2 views
6

Для прокладки из последовательности с некоторым значением, это то, что я придумал:идиома для заполнения последовательностей

(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) 

Мне интересно, если есть более короткая идиома, что делает это уже и, возможно, более эффективно ,

ответ

5

Да, это идиоматический способ перехода к дополняющим разделам последовательности. На самом деле этот код очень похож на part of the partition function in clojure.core с той разницей, что partition не принимает одно значение отступов и вместо этого просит последовательности:

core.clj:

([n step pad coll] 
(lazy-seq 
    ... 
    (list (take n (concat p pad)))))))) 

Вы можете получить те же результаты по передавая коллекцию обивки в раздел:

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) 
+1

Хм, (первый (раздел пп (повтор подушечка) Coll)) на самом деле немного более многословный, и я сомневаюсь, что он работает лучше. Это нужно распаковать, прежде всего, это меня задевает. Я надеялся на что-то очень простое, например, если бы у вас был необязательный третий пэд arg: (возьмите 5 (диапазон 10) ноль) => (0 1 2 3 4 nil nil nil no nil) О, хорошо. – Jegschemesch

0

Вот ленивая версия функции отступа:

(defn lazy-pad 
    "Returns a lazy sequence which pads sequence with pad-value." 
    [sequence pad-value] 
    (if (empty? sequence) 
    (repeat pad-value) 
    (lazy-seq (cons (first sequence) (lazy-pad (rest sequence) pad-value))))) 

Вы можете использовать его как обычные бесконечной ленивых коллекции:

(take 5 (lazy-pad [1 2 3] :pad)) 
=> (1 2 3 :pad :pad) 

ИМ это более изящный этот путь. Вы также можете использовать его с другими функциями, которые ожидают ленивую последовательность, которая не работает, если вы должны указать длину авансовый:

(partition 2 (interleave [1 2 3 4] (lazy-pad [:a] :pad))) 
=> ((1 :a) (2 :pad) (3 :pad) (4 :pad)) 
Смежные вопросы