Используйте стандартное форматирование (см., Например, Practical Common Lisp ).
(defun remplacee (x y l)
(mapcar #'(lambda (c)
((if (eq c x) y x)))
l))
Используйте правильное написание.Поскольку replace
уже является частью стандарта, мы будем использовать некоторый префикс-заполнитель, например my-
.
(defun my-replace (x y l)
(mapcar #'(lambda (c)
((if (eq c x) y x)))
l))
Форма ((if (eq c x) y x))
здесь недопустима.Первым элементом оцениваемого списка должно быть обозначение функции : либо символ, именующий функцию, либо лямбда-форму (т. Е. Список, начинающийся с символа lambda
).Первый элемент здесь не тот.
То, что вы, очевидно, имели в виду, было (if (eq c x) y x)
, т. Е. Внутренняя форма не заключена в другой список.
(defun my-replace (x y l)
(mapcar #'(lambda (c)
(if (eq c x) y x))
l))
Это почти работает, но использует eq
, который сравнивается только по идентичности объекта.Это обычно не достаточно общее, за исключением сравнения интернированных символов или ключевых слов.Обычная функция сравнения по умолчанию: eql
.
(defun my-replace (x y l)
(mapcar #'(lambda (c)
(if (eql c x) y x))
l))
Я бы порекомендовал использовать более описательные имена:
(defun my-replace (item with list)
(mapcar #'(lambda (c)
(if (eql c item) with item))
list))
При желании может иметь смысл разрешить разные компараторы:
(defun my-replace (item with list &key (test #'eql))
(mapcar #'(lambda (c)
(if (funcall test c item) with item))
list))