Этот ответ содержит неверный код.
Легко, просто используйте пользовательские средства форматирования :
(format t "~/acquire/~/disseminate/" '(1 2 3) '*)
Они определены следующим образом:
(let ((memory))
(defun cl-user::acquire (stream list &optional colonp atsignp)
(declare (ignore colonp atsignp stream))
(setf memory list))
(defun cl-user::disseminate (stream operator &optional colonp atsignp)
(declare (ignore colonp atsignp))
(format stream (concatenate 'string "~{~a~^ " (string operator) " ~}") memory)
(setf memory nil)))
Например:
CL-USER> (format t "~/acquire/~/disseminate/" '(1 2 3) '*)
1 * 2 * 3
Переменная memory
входит в лексическую область обеих функций, которые позволяют им передавать данные.Первый хранит список, второй использует его.Если вы никогда не вызовете вторую функцию (или первую с нулем), memory
означает навсегда для последнего списка, это может быть проблемой.Обратите внимание, что у вас могут возникнуть проблемы с параллелизмом. Честно говоря, это не самый лучший способ сделать то, что вы хотите , но он выполняет работу в соответствии с вашими требованиями.