LISP - 编写函数 (REMOVE EL),从列表的所有级别上的另一个列表中删除给定的原子或列表
LISP - Write the function (REMOVE EL), that removes given atom or list from another list on all levels of the list
我有以下任务:
构建函数 (REMOVE EL),从另一个列表中删除给定的原子或列表,这应该应用于列表的每个级别
示例:
L=(A B A (B A C X ) X B)
(REMOVE A L ) -> (B (B C X) X B)
我写了下面的代码:
(defun removeel(el tree)
(mapcan (lambda(subtree)
(cond ((null subtree) (list nil))
((consp subtree) (list (removeel el subtree)))
((eql subtree el) nil)
(t (list subtree))))
tree))
问题是当我删除 atom 时,它工作得很好
(removeel 'B' (A B A (B A C X ) X B))
(A A (A C X) X)
但是如果我想删除一个列表,它不起作用
(removeel '(B A C X) ' (A B A (B A C X ) X B))
(A B A (B A C X) X B)
应该怎样做才能让它也删除列表?
最简单的方法是引入可选的相等性测试函数,如 remove
标准程序。
它可能看起来像这样:
(defun rem-rec (item data &key (test #'eql))
(mapcar (lambda (x) (if (listp x)
(rem-rec item x :test test)
x))
(remove item data :test test)))
CL-USER> (rem-rec 1 `(1 2 (3 4 (1 2 3)) (1 (1 2 3) 3 4)))
;;=> (2 (3 4 (2 3)) ((2 3) 3 4))
对于列表相等,您可以使用 equal
(或 equalp
或更具体的任何内容)
CL-USER> (rem-rec '(1 2 3) '(1 2 (3 4 (1 2 3)) (1 (1 2 3) 3 4)) :test #'equal)
;;=> (1 2 (3 4) (1 3 4))
我有以下任务:
构建函数 (REMOVE EL),从另一个列表中删除给定的原子或列表,这应该应用于列表的每个级别
示例:
L=(A B A (B A C X ) X B)
(REMOVE A L ) -> (B (B C X) X B)
我写了下面的代码:
(defun removeel(el tree)
(mapcan (lambda(subtree)
(cond ((null subtree) (list nil))
((consp subtree) (list (removeel el subtree)))
((eql subtree el) nil)
(t (list subtree))))
tree))
问题是当我删除 atom 时,它工作得很好
(removeel 'B' (A B A (B A C X ) X B))
(A A (A C X) X)
但是如果我想删除一个列表,它不起作用
(removeel '(B A C X) ' (A B A (B A C X ) X B))
(A B A (B A C X) X B)
应该怎样做才能让它也删除列表?
最简单的方法是引入可选的相等性测试函数,如 remove
标准程序。
它可能看起来像这样:
(defun rem-rec (item data &key (test #'eql))
(mapcar (lambda (x) (if (listp x)
(rem-rec item x :test test)
x))
(remove item data :test test)))
CL-USER> (rem-rec 1 `(1 2 (3 4 (1 2 3)) (1 (1 2 3) 3 4)))
;;=> (2 (3 4 (2 3)) ((2 3) 3 4))
对于列表相等,您可以使用 equal
(或 equalp
或更具体的任何内容)
CL-USER> (rem-rec '(1 2 3) '(1 2 (3 4 (1 2 3)) (1 (1 2 3) 3 4)) :test #'equal)
;;=> (1 2 (3 4) (1 3 4))