【问题标题】:Lisp Lamba function with IF带有 IF 的 Lisp Lambda 函数
【发布时间】:2020-01-27 12:25:54
【问题描述】:

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

感谢阅读。

【问题讨论】:

标签: functional-programming lisp common-lisp


【解决方案1】:

使用标准格式(参见例如Practical Common Lisp)。

(defun remplacee (x y l)
  (mapcar #'(lambda (c)
              ((if (eq c x) y x)))
          l))

使用正确的拼写。由于replace 已经是标准的一部分,我们将使用一些占位符前缀,例如。 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多