Основным типом данных в Emacs Lisp является список. Emacs предоставляет множество функций (таких как car
и cdr
) для обработки списка, и легче работать со списком, чем с массивом (включая вектор и строку). Например, функция mapcar
возвращает список, даже если вы передаете ему строку или вектор:
(mapcar #'identity "hello")
;; => (104 101 108 108 111)
(mapcar #'identity [1 2 3])
;; => (1 2 3)
Нередко преобразовать массив в список, обработать список, а затем преобразовать обратно в массив. Помимо concat
и string
, вы также можете построить строку с mapconcat
.
Для вашего кода вы используете функцию, похожую на mapcar, три раза, я думаю, что для следующего используется только один разчитать легче
(let ((result (cons "cypueihajytotrdkgzxfqplbwn"
"cypueihajytomrdkgzxfqplbwn")))
(concat
(delq
nil
(cl-mapcar
(lambda (c1 c2) (and (= c1 c2) c1))
(car result) (cdr result)))))
;; => "cypueihajytordkgzxfqplbwn"
При настойчивом подходе код становится еще чище
(let ((result (cons "cypueihajytotrdkgzxfqplbwn"
"cypueihajytomrdkgzxfqplbwn")))
(cl-loop for x across (car result)
for y across (cdr result)
when (= x y)
concat (string x)))
;; => "cypueihajytordkgzxfqplbwn"