Вау! Сколько лет прошло, и я так и не понял, преобразователь cat
был добавлен в язык. Сначала я подумал, что у вас есть какой-то Python -секретный псевдокод.
Конкретный пример:
(ns tst.demo.core
(:use tupelo.core tupelo.test)) ; <= *** many helper functions! ***
(dotest
(let [a 1 ; int
b 2 ; int
xs [:x1 :x2 :x3] ; list
y 25 ; int
z 26 ; int
]
(spyx (into [a b] cat [xs [y z]]))))
, который печатает:
(into [a b] cat [xs [y z]]) => [1 2 :x1 :x2 :x3 25 26]
Re your вопрос, для маленьких sh размеров concat
кажется вполне хорошим ответом:
(concat [a b] xs [y z]) => (1 2 :x1 :x2 :x3 25 26) ; A lazy sequence
, хотя вы должны знать о Тикающей бомбе замедленного действия для больших последовательностей. Если вам нужна простота и вам не нужна лень, я написал функцию glue
в библиотеке Tupelo Clojure :
; Glue together like collections:
(is (= (glue [ 1 2] '(3 4) [ 5 6] ) [ 1 2 3 4 5 6 ] )) ; all sequential (vectors & lists)
(is (= (glue {:a 1} {:b 2} {:c 3} ) {:a 1 :c 3 :b 2} )) ; all maps
(is (= (glue #{1 2} #{3 4} #{6 5} ) #{ 1 2 6 5 3 4 } )) ; all sets
(is (= (glue "I" " like " \a " nap!" ) "I like a nap!" )) ; all text (strings & chars)
; If you want to convert to a sorted set or map, just put an empty one first:
(is (= (glue (sorted-map) {:a 1} {:b 2} {:c 3}) {:a 1 :b 2 :c 3} ))
(is (= (glue (sorted-set) #{1 2} #{3 4} #{6 5}) #{ 1 2 3 4 5 6 } ))
Другой ответ похож на идею использования syntax-quote
, используя -> vector и unwrap :
(->vector 1 2 3 4 5 6 7 8 9) => [1 2 3 4 5 6 7 8 9]
(->vector 1 (unwrap [2 3 4 5 6 7 8]) 9) => [1 2 3 4 5 6 7 8 9]
Это также будет работать рекурсивно для вложенных вызовов unwrap:
(->vector 1 (unwrap [2 3 (unwrap [4 5 6]) 7 8]) 9) => [1 2 3 4 5 6 7 8 9]
Если скалярные значения находятся только в начале или в конце, я бы предложил с использованием prepend
и append
:
(append [1 2] 3 ) ;=> [1 2 3 ]
(append [1 2] 3 4) ;=> [1 2 3 4]
(prepend 3 [2 1]) ;=> [ 3 2 1]
(prepend 4 3 [2 1]) ;=> [4 3 2 1]
Конечно, если вам не нужно сохранять любая вложенная структура в 5 вещах, которые вы комбинируете, возможно, Большой Кувалда (тм) является самым простым:
(flatten [[a b] xs [y z]]) => (1 2 :x1 :x2 :x3 25 26)
Как всегда, не забудьте для изучения Clojure CheatSheet!