2010-10-19 46 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