当函数只假设交换等于 z 的值时,该函数正在用 y 替换整个列表

问题描述

(defun replace (L z y)
  (let ((f (lambda (x)
             (if (equal x z)
                 y x) z y)))
    (mapcar f L)))



(replace '(3 1 5 6 3 2 3) 3 9)
(9 9 9 9 9 9 9)

解决方法

您的 lambda 总是返回 y,因为您的 z 后面有一个 y 和一个 if。更改它以删除那些然后它就可以工作了:

(defun replace (L z y)
  (let ((f (lambda (x)
             (if (equal x z)
                 y
               x))))
    (mapcar f L)))

(replace '(3 1 5 6 3 2 3) 3 9)
(9 1 5 6 9 2 9)