我的替换功能有问题

时间:2013-09-23 05:20:18

标签: emacs replace elisp

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

;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)))))))

1 个答案:

答案 0 :(得分:6)

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

此外,您的循环缺少终止条件。就像现在一样,在第一个问题得到解决的情况下,它将无限期地运行,始终采用第二个分支,并以nilL递归调用自身。

最后,后一个分支中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))))))