2010-10-19 72 views
4

我想要寫在LISP的功能,這將完全刪除列表中的所有NILS。該列表可以嵌套,這意味着它可以包含其他列表。例如,列表'((狀態L L L L)NIL(狀態L L R L)NIL)應該轉換爲'((狀態L L L L)(狀態L L R L))。LISP函數刪除尼爾斯

+2

難道還有在子列表'NIL's?如果是的話,他們是否也應該被刪除?如果是,嵌套有多深? – Svante 2010-10-19 10:28:16

回答

10
(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)) 
1

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))) 
3

保羅格雷厄姆調用此函數(重複到子列表中刪除-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)) 
1
(defun remove-if-nil (list) (remove-if-not 'identity list)) 

刪除若非則需要一個謂語和一個列表,並刪除列表中的所有項目在謂詞計算時不滿足謂詞,也就是說,回報爲零。正如你猜測的那樣,返回的結果完全相同,所以(remove-if-not)標識列表將刪除列表中的所有nil元素。

+1

雖然這個代碼塊可能會回答這個問題,但最好能提供一些解釋爲什麼它會這樣做。 – DavidPostill 2014-09-09 21:08:16

+0

我添加了一個簡短的解釋,我希望它有助於澄清。 – 2014-09-17 23:11:26

+0

這似乎沒有處理嵌套列表作爲問題陳述。 – blujay 2016-03-10 07:30:10