我试图作为新的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/