Lisp Lamba函数与IF

时间:2019-09-27 07:48:30

标签: functional-programming lisp common-lisp

我对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)
    )

感谢阅读。

1 个答案:

答案 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))