我试图将一个简单的替换方法作为一个新的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)))))))
答案 0 :(得分:6)
您的代码中存在几个问题。首先,你有一些额外的括号。 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))))))