Вот решение, которое использует reduce
для вызова substitute
для каждой из старых-новых пар, постепенно преобразовывая исходную последовательность:
(defun myreplace (substitutions sequence)
(reduce (lambda (seq substitution)
(destructuring-bind (old new) substitution
(substitute new old seq)))
substitutions
:initial-value sequence))
РЕДАКТИРОВАТЬ: Идея Трея использовать assoc
(не assq
, это Emacs Lisp) для нахождения замены очень хороша. Это можно упростить с помощью оператора, который имеет встроенную поддержку для создания нового списка, то есть mapcar
или loop
с предложением collect
:
(defun myreplace (substitutions list)
(mapcar (lambda (elt)
(let ((substitution (assoc elt substitutions)))
(if substitution
(second substitution)
elt)))
list))
или
(defun myreplace (substitutions list)
(loop for elt in list
for substitution = (assoc elt substitutions)
when substitution collect (second substitution)
else collect elt))