从列表中删除 NIL 的 LISP



简单问题。

假设我的列表中有一堆NIL。有没有一种简单的方法可以删除NIL并只保留数字?。eval似乎在这里不工作。

(NIL 1 NIL 2 NIL 3 NIL 4)

我需要(1 2 3 4)

Common Lisp,而不是remove(如果可以使用remove:)

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

在常见的lisp和其他方言中:

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

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

(define lst '(NIL 1 NIL 2 NIL 3 NIL 4))
(filter (lambda (x) (not (equal? x 'NIL)))
        lst)

正如我在上面的评论中所指出的,我不确定你使用的是哪种Lisp方言,但你的问题完全符合过滤器函数的模式(Python在这里有很好的过滤器文档)。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解释器没有内置的过滤函数,我怀疑它确实有。然后,您可以通过拨打只保留列表l中的号码

(filter number? l)

(remove-if-not #'identity list)

最新更新