Я хочу преобразовать ("USERID=XYZ" "USERPWD=123")
в "USERID=XYZ&USERPWD=123"
. Я пробовал
(apply #'concatenate 'string '("USERID=XYZ" "USERPWD=123"))
что вернет ""USERID=XYZUSERPWD=123"
.
Но я не знаю, как вставить '&'? Следующая функция работает, но кажется немного сложной.
(defun join (list &optional (delim "&"))
(with-output-to-string (s)
(when list
(format s "~A" (first list))
(dolist (element (rest list))
(format s "~A~A" delim element)))))
С новой и простой библиотекой str :
(ql:quickload "str")
(str:join "&" '("USERID=XYZ" "USERPWD=123"))
Он использует формат, как объяснено в других ответах:
(defun join (separator strings)
" "
(let ((separator (replace-all "~" "~~" separator)))
(format nil
(concatenate 'string "~{~a~^" separator "~}")
strings)))
(автор этого, сделать простые вещи, как это просто).
Melpa размещает пакет s ("Длинная потерянная библиотека обработки строк Emacs"), который обеспечивает много утилит простой строки, включая строкового столяра:
(require 's)
(s-join ", " (list "a" "b" "c"))
"a, b, c"
Если это имеет значение, очень тонко под капотом, это использует пару функций шепелявости от fns.c
, а именно, mapconcat
и identity
:
(mapconcat 'identity (list "a" "b" "c") ", ")
"a, b, c"