我需要编写一个lisp函数来消除整数列表中每次出现的x。例如,(elim 7'(7 6 8 8 7 7 9 0))返回(6 8 8 9 0)
答案 0 :(得分:7)
你不需要写它;它已经为你写了,它被称为remove
:
CL-USER> (remove 7 '(7 6 8 8 7 7 9 0))
;=> (6 8 8 9 0)
如果您确实需要将其称为elim
,则可以使用(setf fdefinition)
:
CL-USER> (setf (fdefinition 'elim) (fdefinition 'remove))
;=> ...
CL-USER> (elim 7 '(7 6 8 8 7 7 9 0))
;=> (6 8 8 9 0)
答案 1 :(得分:1)
假设你真的需要写它,通常的方法适用:
<强>递归强>
(defun elim (value list)
(if list
(let ((c (car list)))
(if (= c value)
(elim value (cdr list))
(cons c (elim value (cdr list)))))
(reverse list)))
尾递归
(defun elim (value list)
(labels ((sub (list res)
(if list
(let ((c (car list)))
(if (= c value)
(sub (cdr list) res)
(sub (cdr list) (cons c res))))
(reverse res))))
(sub list '())))
<强>环强>
(defun elim (value list)
(loop for i in list
unless (= i value)
collect i))
答案 2 :(得分:0)
递减列表,直到列表为空。如果列表的头部等于提供的项目,则不在输出中包含它:
(defun elim (value list)
(if (null list)
'()
(let ((next (car list))
(rest (cdr list)))
(if (= value next)
(elim value rest)
(cons next (elim value rest))))))