Извините, но элисп не мой лучший. Мне нужно объединить два списка строк следующим образом:
("a" "b" "c") + ("d" "e" "f") -> ("a" "b" "c" "d" "e" "f")
Ну, порядок не важен, поэтому я написал этот код:
(while lista
(add-to-list 'listb (car lista))
(setq lista (cdr lista)))
Это работает, но мне интересно, есть ли функция, которая уже делает это.
Любая подсказка? Заранее спасибо.
append
это правильный ответ здесь, но другой (разрушительный) способ сделать это будет(setcdr (last a) b)
.(-concat '(1) '(2 3) '(4)) ;; => '(1 2 3 4)
add-to-list
в коде на Лиспе (это сказано в строке документации). Вместо этого используйтеpush
.Ответы:
Вы также можете просто использовать приложение.
источник
(nconc '("a" "b" "c") '("d" "e" "f"))
append
кажется, здесь лучше.cl-concatenate
используетappend
когда TYPElist
, так что оба ответа дают одинаковый результат.Так что для вашего примера
Поскольку это определено в
cl
вас, возможно, придется(require 'cl)
сначала, в противном случае вы можете использовать,cl-concatenate
который, кажется, загружен по умолчанию.Кроме того, как указывает @phils,
cl-concatenate
просто вызывает,append
когда TYPE есть'list
, вот источник изcl-extra.el
:Так что, если вы используете только списки, проще использовать напрямую
append
, как указал @John Kitchin.Наконец, @lawlist упомянул
nconc
:Что это значит:
источник
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)
работает нормальноvarname
а не'varname
).seq-concatenate
(после(require 'seq)
), хотя это, в свою очередь, просто переноситcl-concatenate
.