我对LISP有点陌生,我试图使用仅mapcar和lambda函数来实现“用列表l中的y替换x的每个出现”。
我猜想lambda函数将检查条目是否等于“ x”,并将其替换为“ y”。 但是lamba函数似乎不接受IF或cond语句,是否有适当的方法来做到这一点?
(defun remplacee(x y l)
(mapcar #'(lambda(c)((IF (EQ c x) y x))) l)
)
感谢阅读。
答案 0 :(得分:2)
使用标准格式(例如,参见Practical Common Lisp)。
(defun remplacee (x y l)
(mapcar #'(lambda (c)
((if (eq c x) y x)))
l))
使用正确的拼写。由于replace
已成为标准的一部分,因此我们将使用一些占位符前缀e。 G。 my-
。
(defun my-replace (x y l)
(mapcar #'(lambda (c)
((if (eq c x) y x)))
l))
表格((if (eq c x) y x))
在这里无效。评估列表的第一项必须是功能指示符:可以是命名功能的符号,也可以是lambda形式(即以符号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))