2012-02-20 41 views
3

简单的问题。从列表中删除NIL's LISP

假设我在列表q中有一堆NIL。有没有简单的方法来删除NIL并保持数字? eval在这里似乎不起作用。

(NIL 1 NIL 2 NIL 3 NIL 4) 

我需要(1 2 3 4)

+1

听起来你正在寻找一个过滤功能。您使用哪种Lisp方言(Scheme,Common Lisp等)? – 2012-02-20 03:45:12

+0

Common Lisp。这是有道理的有一个内置的函数,忽略NILs .. – CyberShot 2012-02-20 03:48:49

+0

@JohnPick钉它,检查他的答案! – 2012-02-20 03:57:13

回答

12

Common Lisp的保持,而不是只从你的列表l号码,删除,如果你可以使用删除:

(remove nil '(nil 1 nil 2 nil 3 nil 4)) 
9

Common Lisp中,也许还有其他方言:

(remove-if #'null '(NIL 1 NIL 2 NIL 3 NIL 4)) 
+1

用户“规格”有一个更直接的答案。 – 2012-02-20 18:26:05

1

如果您使用计划,这将很好地工作:

(define lst '(NIL 1 NIL 2 NIL 3 NIL 4)) 

(filter (lambda (x) (not (equal? x 'NIL))) 
     lst) 
0

正如我在我上面的评论中指出,我不确定您使用的是哪种Lisp方言,但是您的问题完全符合过滤器函数的模型(Python对其过滤器here有很好的文档)。从SICP拍摄的计划实施

(define (filter predicate sequence) 
    (cond ((null? sequence) nil) 
     ((predicate (car sequence)) 
     (cons (car sequence) 
       (filter predicate (cdr sequence)))) 
     (else (filter predicate (cdr sequence))))) 

假设,当然,你的Lisp解释不具有内置过滤功能,因为我怀疑它。然后,您可以通过调用

(filter number? l)