我想要寫在LISP的功能,這將完全刪除列表中的所有NILS。該列表可以嵌套,這意味着它可以包含其他列表。例如,列表'((狀態L L L L)NIL(狀態L L R L)NIL)應該轉換爲'((狀態L L L L)(狀態L L R L))。LISP函數刪除尼爾斯
回答
(defun remove-nil-recursively (x)
(if (listp x)
(mapcar #'remove-nil-recursively
(remove nil x))
x))
工程爲您例如:
[1]> (remove-nil-recursively '((state L L L L) NIL (state L L R L) NIL))
((STATE L L L L) (STATE L L R L))
而且隨着嵌套列表:
[2]> (remove-nil-recursively '(NIL (state L L nil R L) NIL))
((STATE L L R L))
但是要注意:
[3]> (remove-nil-recursively '(NIL (state L L (nil) R L) NIL))
((STATE L L NIL R L))
在remove-if
風格的通用功能:
(defun remove-all (predic seq &optional res)
(if (null seq)
(reverse res)
(cond ((and (not (null (car seq))) (listp (car seq)))
(remove-all predic (cdr seq)
(cons (remove-all predic (car seq)) res)))
((funcall predic (car seq))
(remove-all predic (cdr seq) res))
(t (remove-all predic (cdr seq) (cons (car seq) res))))))
實例:
> (remove-all #'null (list 1 2 'nil 3))
=> (1 2 3)
> (remove-all #'null (list 1 2 'nil '(4 5 nil 6) 3))
=> (1 2 (4 5 6) 3)
> (remove-all #'(lambda (x) (oddp x)) '(1 2 (3 4) 5 6 (7 8 (9 10))))
=> (2 (4) 6 (8 (10)))
保羅格雷厄姆調用此函數(重複到子列表中刪除-IF)在On Lisp 「剪枝」,第49.它是效用函數之一。
(defun prune (test tree)
(labels ((rec (tree acc)
(cond
((null tree) (nreverse acc))
((consp (car tree))
(rec (cdr tree)
(cons (rec (car tree) nil) acc)))
(t (rec (cdr tree)
(if (funcall test (car tree))
acc
(cons (car tree) acc)))))))
(rec tree nil)))
(prune #'evenp '(1 2 (3 (4 5) 6) 7 8 (9)))
(1 (3 (5)) 7 (9))
(defun remove-if-nil (list) (remove-if-not 'identity list))
刪除若非則需要一個謂語和一個列表,並刪除列表中的所有項目在謂詞計算時不滿足謂詞,也就是說,回報爲零。正如你猜測的那樣,返回的結果完全相同,所以(remove-if-not)標識列表將刪除列表中的所有nil元素。
雖然這個代碼塊可能會回答這個問題,但最好能提供一些解釋爲什麼它會這樣做。 – DavidPostill 2014-09-09 21:08:16
我添加了一個簡短的解釋,我希望它有助於澄清。 – 2014-09-17 23:11:26
這似乎沒有處理嵌套列表作爲問題陳述。 – blujay 2016-03-10 07:30:10
- 1. 軌尼爾斯
- 2. 預計尼爾斯
- 3. 尼斯hijax偶爾失敗
- 4. 回報率:.create尼爾斯
- 5. 紅寶石:尼爾斯在IF語句
- 6. 哈斯克爾:與埃拉托色尼
- 7. lisp中的布爾函子
- 8. 哈斯克爾是一種Lisp方言
- 9. 刪除項目哈斯克爾
- 10. 刪除所有空的哈斯克爾
- 11. ModRewrite尼斯URL
- 12. 的Emacs Lisp函數,即寫區域到文件,並刪除它
- 13. Lisp從列表中刪除數據
- 14. 尼斯URL格式
- 15. 使用尼克斯打字系統`尼克斯-instantiate`
- 16. 斯卡拉布爾函數抽象
- 17. 哈斯克爾:遞歸在lambda函數
- 18. 哈斯克爾映射函數列表
- 19. 哈斯克爾函數的返回值
- 20. 哈斯克爾函數定義約定
- 21. 哈斯克爾函數求解釋
- 22. 哈斯克爾誤差函數
- 23. 哈斯克爾readsPrec有理函數
- 24. 哈斯克爾函數組合混淆
- 25. 哈斯克爾申請單值函數
- 26. 哈斯克爾函數簽名錯誤
- 27. 重載函數簽名哈斯克爾
- 28. 哈斯克爾:一元lambda函數
- 29. 哈斯克爾匿名函數
- 30. 哈斯克爾 - 幫助理解函數
難道還有在子列表'NIL's?如果是的話,他們是否也應該被刪除?如果是,嵌套有多深? – Svante 2010-10-19 10:28:16