2011-10-04 12 views
8

cons attualmente si comporta in questo modo:In Clojure, come cons o conj gli elementi di una collezione, ma non la raccolta stessa?

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

vorrei realizzare:

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

non riuscivo a trovare una risorsa per questo eppure questo sembra così semplice mi sento ci dovrebbe essere costruito in funzione.

O io non so le parole di scrittura per descrivere questa situazione. In ogni caso, per favore fatemelo sapere. Grazie!

Edit: Si prega di non rispondere con "appiattire": P cioè

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

Solo per farvi capire meglio 'cons'. 'cons' sta per" costrutto ". Costruisce una lista aggiungendo nuovi elementi all'inizio della lista, uno per uno. Il tipo di funzione che stai cercando dovrebbe aggiungere tutti gli elementi di una lista a un'altra o semplicemente concatenare 2 elenchi. Così, in Common Lisp si chiama 'append' e in Clojure, come altri hanno già detto qui, -' concat'. – ffriend

risposta

10

devi usare concat: uso

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

Esempio:

user> (concat '(1 2) '(3)) 
(1 2 3) 
5

Credo siete alla ricerca di concat (si pensi "concatenare liste"):

[Concat ] restituisce un pigro seq che rappresenta la concatenazione degli elementi nelle colls fornite.

In questo caso l'utilizzo sarebbe:

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

Si noti che a differenza di (molti) altri LISP-dialetti, di Clojure concat produce una sequenza di pigro. Vedere How to covert a lazy sequence to a non-lazy in Clojure? per come "forzare" una sequenza (questo può o non può essere utile/necessario, a seconda del contesto più ampio, ma è importante tenere a mente).

Felice codifica.

4

Un'alternativa è "in".

nella sempre restituisce il tipo di primo argomento, a differenza concat che restituisce sempre una lista.

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

(into '(2 4) '(1 2 3)) 
(3 2 1 2 4) 
Problemi correlati