В Clojure, как можно объединить элементы коллекции, но не саму коллекцию? - PullRequest
8 голосов
/ 04 октября 2011

минусы в настоящее время ведут себя так:

(cons '(1 2) '(3))
;=> ((1 2) 3)

Я бы хотел достичь:

(magic-cons '(1 2) '(3))
;=> (1 2 3)

Я не смог найти ресурс для этого, но это кажется таким простым, я чувствую, что должна быть встроенная функция.

Или я просто не знаю, как написать слова, чтобы описать эту ситуацию. В любом случае, пожалуйста, дайте мне знать. Спасибо!

Edit: Пожалуйста, не отвечайте "сгладить": P то есть

(flatten (cons '(1 2) '(3)))

Ответы [ 3 ]

10 голосов
/ 04 октября 2011

Вы должны использовать concat:

clojure.core/concat
([] [x] [x y] [x y & zs])
  Returns a lazy seq representing the concatenation of the elements in the supplied colls.

Пример использования:

user> (concat '(1 2) '(3))
(1 2 3)
5 голосов
/ 04 октября 2011

Я полагаю, что вы ищете concat (подумайте "списки конкатенаций"):

[Concat] возвращает ленивый seq, представляющий конкатенацию элементов в предоставленномcolls.

В этом случае использование будет:

(concat '(1 2) '(3))    

Обратите внимание, что в отличие от (многих) других LISP-диалектов, concat Clojure дает ленивую последовательность.См. Как преобразовать ленивую последовательность в не ленивую в Clojure? о том, как «форсировать» последовательность (это может или не может быть полезным / необходимым, в зависимости от более широкого контекста, но важно сохранитьв уме).

Удачного кодирования.

4 голосов
/ 05 октября 2011

Альтернатива - "в".

into всегда возвращает тип первого аргумента, в отличие от concat, который всегда возвращает список.

=> (into [2 4] '(1 2 3))
[2 4 1 2 3]

(into '(2 4) '(1 2 3))
(3 2 1 2 4)
...