2012-02-20 40 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)