concatenate é um alias para 'cl-concatenate' em 'cl.el'.
(concatenar a SEQUÊNCIA DE TIPO ...)
Concatene, em uma sequência do tipo TYPE, o argumento SEQUENCEs.
Então, para o seu exemplo
(concatenate 'list '("a" "b" "c") '("d" "e" "f"))
Como está definido, clvocê pode precisar (require 'cl)primeiro, caso contrário, você pode usar o cl-concatenateque parece ser carregado por padrão.
Além disso, como apontado por @phils cl-concatenateapenas chama appendquando TYPE é 'list, aqui está a fonte de cl-extra.el:
(defun cl-concatenate (type &rest sequences)
"Concatenate, into a sequence of type TYPE, the argument SEQUENCEs.
\n(fn TYPE SEQUENCE...)"
(pcase type
(`vector (apply #'vconcat sequences))
(`string (apply #'concat sequences))
(`list (apply #'append (append sequences '(nil))))
(_ (error "Not a sequence type name: %S" type))))
Portanto, se você estiver usando apenas listas, é mais fácil usar diretamente append, como apontado por @John Kitchin.
Por fim, o @lawlist mencionou nconc:
O nconc é uma função interna do 'código fonte C'.
(lista Nconc e Rest)
Concatene qualquer número de listas alterando-as. Somente o último argumento não é alterado e não precisa ser uma lista.
O que isto significa:
(nconc '("a" "b" "c") '("d" "e" "f"))
=> ("a" "b" "c" "d" "e" "f")
(setq l1 '("a" "b" "c")
l2 '("d" "e" "f"))
(nconc l1 l2)
=> ("a" "b" "c" "d" "e" "f")
l1
=> ("a" "b" "c" "d" "e" "f")
l2
=> ("d" "e" "f")