我試圖從列表中的任何級別刪除列表中的所有元素。 我需要使用地圖功能,雖然。我正在使用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))
我希望我的問題結構良好且足夠詳細,我正在提供工作示例。有人可以給我一些關於如何解決這個問題的提示嗎?
是'reduce'認爲是「地圖功能」? – Sylwester
不,問題表明我必須使用mapcon,mapcan,mapcar或maplist。這不是家庭作業順便說一句,我只是練習即將到來的考試。 – MikhaelM
它應該是'(fdelete'(1 2 3 4(3))3)=>(1 2 4())'',因爲'(fdelete'(3)3)=>()'。 –