Przepraszam, ale elisp nie jest mój najlepszy. Muszę połączyć w ten sposób dwie listy ciągów:
("a" "b" "c") + ("d" "e" "f") -> ("a" "b" "c" "d" "e" "f")
Cóż, kolejność nie jest ważna, więc napisałem ten kod:
(while lista
(add-to-list 'listb (car lista))
(setq lista (cdr lista)))
Działa, ale zastanawiam się, czy istnieje funkcja, która już to robi.
Jakieś wskazówki? Z góry dziękuję.
append
jest poprawną odpowiedzią tutaj, ale byłby to inny (destrukcyjny) sposób(setcdr (last a) b)
.(-concat '(1) '(2 3) '(4)) ;; => '(1 2 3 4)
add-to-list
w kodzie Lisp (mówi to w dokumentacji). Zamiast tego użyjpush
.Odpowiedzi:
Możesz także użyć append.
źródło
(nconc '("a" "b" "c") '("d" "e" "f"))
append
wydaje się tutaj lepiej.cl-concatenate
używa,append
gdy TYPElist
, więc obie odpowiedzi dają ten sam wynik.Na przykład
Ponieważ jest on zdefiniowany
cl
, być może będziesz musiał(require 'cl)
najpierw, w przeciwnym razie możesz użyć tego,cl-concatenate
co wydaje się być domyślnie załadowane.Ponadto, jak wskazuje @phils,
cl-concatenate
po prostu wywołuje,append
gdy TYPE'list
, oto źródło zcl-extra.el
:Jeśli więc używasz tylko list, łatwiej jest z nich korzystać bezpośrednio
append
, jak wskazał @John Kitchin.Wreszcie @lawlist wspomniał
nconc
:Co to znaczy:
źródło
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)
działa ok.varname
wolisz niż'varname
).seq-concatenate
(po(require 'seq)
), chociaż to z kolei po prostu się zawijacl-concatenate
.