0

我需要从包含内部列表的列表中删除一个元素。预定义的元素也应该从每个内部列表中删除。

我已经开始使用以下代码:

(SETQ L2 '(a b ( a 2 b) c 1 2 (D b (a s 4 2) c 1 2 a) a )) ; defined my list 

; Created a function for element removing
(defun elimina (x l &optional l0)
(cond (( null l)(reverse l0))
((eq x (car l))(elimina x (cdr l) l0))
(T (elimina x (cdr l) (cons (car l) l0))))
)

(ELIMINA 'a L2) 

但不幸的是,它只删除了嵌套列表之外的元素。

我试图创建一个附加函数,它将从内部列表中删除元素。

(defun elimina-all (x l)
(cond ((LISTP (CAR L))(reverse l)(elimina x (car l)))
(T (elimina-all  x (CDR L)))
)
)

但仍然没有成功。

你能帮我解决吗?

先感谢您。

4

3 回答 3

2

首先,我建议你阅读这本书,至少,这个页面,它解释了(并给出了很好的例子!)如何遍历树,但最重要的是,如何组合函数以利用更复杂的任务从更简单的任务。

;; Note that this function is very similar to the built-in
;; `remove-if' function. Normally, you won't write this yourself
(defun remove-if-tree (tree predicate)
  (cond
    ((null tree) nil)
    ((funcall predicate (car tree))
     (remove-if-tree (cdr tree) predicate))
    ((listp (car tree))
     (cons (remove-if-tree (car tree) predicate)
           (remove-if-tree (cdr tree) predicate)))
    (t (cons (car tree)
             (remove-if-tree (cdr tree) predicate)))))

;; Note that the case of the symbol names doesn't matter
;; with the default settings of the reader table. I.e. `D' and `d'
;; are the same symbol, both uppercase.
;; Either use \ (backslash) or || (pipes
;; around the symbol name to preserve the case. Eg. \d is the
;; lowercase `d'. Similarly, |d| is a lowercase `d'.
(format t "result: ~s~&"
        (remove-if-tree
         '(a b (a 2 b) c 1 2 (D b (a s 4 2) c 1 2 a) a)
         #'(lambda (x) (or (equal 1 x) (equal x 'a)))))

这是解决问题的一种方法的简短示例。阅读评论。

于 2012-04-30T17:30:53.160 回答
0

也许是这样的:

(defun elimina (x l &optional l0)
  (cond ((null l) (reverse l0))
        ((eq x (car l)) (elimina x (cdr l) l0))
        (T (elimina x (cdr l) (cons (if (not (atom (car l))) 
                                        (elimina x (car l)) 
                                        (car l))
                                     l0)))))
于 2012-04-30T09:49:45.303 回答
0

我一直在寻找与您相同的答案,不幸的是,我无法完全理解上面的答案,所以我一直在研究它,最后我在 Lisp 中得到了一个非常简单的函数,它完全符合您的要求。

(defun remove (a l)
(cond
    ((null l) ())
        ((listp (car l))(cons (remove a (car l))(remove a (cdr l))))
        ((eq (car l) a) (remove a (cdr l)))
        (t (cons (car l) (remove a (cdr l))))
        )
    )

该函数从两个简单的情况开始,它们是:'list is null'和'first element is a list'。在此之后,您将“神奇地”获得car列表的 和cdr没有给定元素的列表的 。要将其修复为整个列表的答案,您只需使用cons.

于 2015-03-11T23:34:37.143 回答