Lisp 映射到两个参数

Lisp 映射到两个参数,lisp,common-lisp,Lisp,Common Lisp,我是口齿不清的新手。我正在编写一个递归函数来删除列表中所有出现的元素 这就是我试图写的,只删除列表中作为原子出现的事件 (defun my-remove(x list) (if(null list) nil (if(eql x (car list)) (my-remove x (cdr list)) (cons (car list) (my-remove x (cdr list)))))) 现在,我必须修改它,以便它也处理列表中子列表的元

我是口齿不清的新手。我正在编写一个递归函数来删除列表中所有出现的元素

这就是我试图写的,只删除列表中作为原子出现的事件

(defun my-remove(x list)
  (if(null list)
     nil
     (if(eql x (car list))
        (my-remove x (cdr list))
        (cons (car list) (my-remove x (cdr list))))))
现在,我必须修改它,以便它也处理列表中子列表的元素。该函数将从子列表中删除元素,并将其保留为子列表(它不应使子列表变平)

范例- 输入-

预期产量-

((b) (c d e) nil b))
我知道mapcar可以用于将函数应用于列表的所有元素。但是我的函数有两个参数,要删除的元素和列表。是否仍有任何方法可以应用mapcar,或者您可以提出任何替代方案


我只允许使用基本功能
cons
equal
defun
car
cdr
等。

mapcar
是一个功能。它是否在您接受的功能列表中? 到目前为止,您的工作可以很容易地更改为递归。您需要以不同的方式对待原子和列表结构:

(defun my-remove (x list)
  (cond ((null list) nil)
        ((atom (car list)) 
         (if (eql x (car list))
             (my-remove x (cdr list))
             (cons (car list) (my-remove x (cdr list)))))
        (t (cons (my-remove <??> <??>)
                 (my-remove <??> <??>)))))
词法作用域的主要特点是,在创建函数时,所有先前绑定的变量都可用。这里您可以看到它的作用,因为
test
的所有参数都可以在
mapcar

我认为您不应该为此使用
mapcar
,因为您发现元素将被删除,您必须返回一个值,然后将其放置到位。我见过有人返回一个元素或零的列表,并使用
mapcan
。它基本上与
(append(mapcar fun lst))


好的,我明白了。我被允许映射汽车,但现在不需要了。谢谢你的帮助。:)
(defun my-remove (x list)
  (cond ((null list) nil)
        ((atom (car list)) 
         (if (eql x (car list))
             (my-remove x (cdr list))
             (cons (car list) (my-remove x (cdr list)))))
        (t (cons (my-remove <??> <??>)
                 (my-remove <??> <??>)))))
(defun test (op n lst)
  (mapcar (lambda (e) (funcall op n e))
          lst))

(test #'+ 10 '(1 2 3)) ; ==> (11 12 13)
(mapcan (lambda (x) 
          (if (= x 1) 
              nil 
              (list x))) 
        '(1 2 3 1 2 3)) ; ==> (2 3 2 3)