Какой канонический способ объединения строк в списке?

Я хочу преобразовать ("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)))))
23
задан N.N. 21 October 2012 в 15:52
поделиться

2 ответа

С новой и простой библиотекой 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)))

(автор этого, сделать простые вещи, как это просто).

1
ответ дан 29 November 2019 в 01:24
поделиться

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"
2
ответ дан 29 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: