Я пытаюсь удалить все вхождения элемента из списка из любых уровней списка. Я должен использовать функцию карты, хотя. Я использую Common Lisp. Например, я хотел бы быть в состоянии сделать:Удалить вхождения элемента из нелинейного списка
(fdelete '(1 2 3 4 (3)) 3) => (1 2 4)
То, что я пытался до сих пор: Эта функция будет делать то, что нужно, вроде. Он заменит все вхождения данного элемента на NIL, так что это не совсем то, что я хочу.
(defun fdelete (l e)
(cond
((null l) 0)
((equal l e) nil)
((atom l) l)
(t (mapcar (lambda(l) (fdelete l e)) l))
)
)
Это сделает
(fdelete '(1 2 3 4 (3)) 3) => (1 2 NIL 4 (NIL))
Моя вторая попытка это с функцией mapcap, так как это не будет возвращать список один и тот же размер, что и входной список. Это сделает все, что нужно, но оно «уничтожит» мой первоначальный список, так как в нем будут отображаться все субблисты на поверхность ».
(defun fdelete (l e)
(cond
((null l) 0)
((equal l e) nil)
((atom l) (list l))
(t(mapcan(lambda(x) (fdelete x e))l))
)
)
Так что это действительно делает (fdelete '(1 2 3 4 (3)) 3) => (1 2 4)
, но он также будет делать это неправильно, если я, например, попробуйте следующее:
(fdelete '(1 2 3 (4) (3)) 3)) => (1 2 4)
Я хочу, чтобы это сделать (fdelete '(1 2 3 (4) (3)) 3)) => (1 2 (4))
Я надеюсь, что мой вопрос хорошо сформирован и достаточно подробен, и я предоставляю рабочие примеры. Может ли кто-нибудь дать мне несколько советов о том, как решить эту проблему?
Является ли 'сокращение' считанным« функцией карты »? – Sylwester
Нет, проблема заключается в том, что я должен использовать либо mapcon, mapcan, mapcar, либо maplist. Это не домашнее задание, я просто тренируюсь на предстоящем экзамене. – MikhaelM
это должно быть '(fdelete '(1 2 3 4 (3)) 3) => (1 2 4())' действительно, потому что '(fdelete' (3) 3) =>()'. –