我试图作为新的Lisp用户制作一个简单的replace方法,但无法理解为什么它无法正常工作。

;replace element e1 with element e2 in a list L
(defun my-replace (e1 e2 L)
  (cond
   ;if the first of L is e1, cons e2 & rest L
   ((equal (car L) (e1)) (cons (e2) (my-replace (e1 e2 (cdr L)))))
   ;else cons e1 & rest L
   (t  (cons (e1) (my-replace (e1 e2 (cdr L)))))))

最佳答案

您的代码中有几个问题。首先,您有一些额外的括号。 e1表示e1的值,但是(e1)表示函数e1的返回值。由于您没有此类功能,因此它将失败。

此外,您的循环缺少终止条件。现在,第一个问题已修复,它将无限期运行,始终采用第二个分支并以nil作为L递归调用自身。

最后,后面分支中的cons的第一个参数是错误的:当(car L)e1不匹配时,您要从(car L)而不是e1构造结果,对吗?那将保留列表中的内容,而不是将其替换为第一个参数。

这是固定版本:

(defun my-replace (e1 e2 L)
  (cond
    ;;if at the end of list, terminate
    ((null L) nil)
    ;;if the first of L is e1, cons e2 & rest L
    ((equal (car L) e1)
     (cons e2 (my-replace e1 e2 (cdr L))))
    ;;else cons e1 & rest L
    (t
     (cons (car L) (my-replace e1 e2 (cdr L))))))

关于emacs - 我的替换功能有问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18952206/

10-12 22:13