Функция Лисп Ламба с IF - PullRequest
       90

Функция Лисп Ламба с IF

0 голосов
/ 27 сентября 2019

Я немного новичок в LISP, и я пытаюсь сделать функцию «Заменить каждый случай x на y в списке l» только mapcar и лямбда-функцией.

Я полагаю, что лямбда-функция проверит,запись равна «х» и заменить ее на «у».Но функция lamba, похоже, не принимает IF или cond утверждений, есть ли какой-нибудь правильный способ сделать это?

(defun remplacee(x y l)
    (mapcar #'(lambda(c)((IF (EQ c x) y x))) l)
    )

Спасибо за чтение.

1 Ответ

2 голосов
/ 27 сентября 2019

Используйте стандартное форматирование (см., Например, 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))
...