2

作为一个新的 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)))))))
4

1 回答 1

6

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

此外,您的循环缺少终止条件。就像现在一样,在第一个问题修复后,它将无限期地运行,总是采用第二个分支并使用nilas递归地调用自己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))))))
于 2013-09-23T05:36:25.043 回答