Lisp 检查列表是否至少包含一个非nil元素

Lisp 检查列表是否至少包含一个非nil元素,lisp,clisp,Lisp,Clisp,标题几乎说明了一切 我在寻找类似的东西 (atleastonenonnil '(nil nil nil nil '(A B C))) => T 我可以用递归的方式来做,但我做不到。我应该使用一些内置功能吗? 我使用的是cLisp如果处理列表的第一个元素,那么其余的都可以递归完成。代码如下: (defun at-least-one-nonnil (l) (and (not (nullp l)) (or (car l) (at-least-one-no

标题几乎说明了一切

我在寻找类似的东西

(atleastonenonnil '(nil nil nil nil '(A B C)))
=> T
我可以用递归的方式来做,但我做不到。我应该使用一些内置功能吗?
我使用的是
cLisp

如果处理列表的第一个元素,那么其余的都可以递归完成。代码如下:

(defun at-least-one-nonnil (l)
  (and (not (nullp l))
       (or (car l)
           (at-least-one-nonnil (cdr l))))))
当然,在这个简单的例子中,已经有了一个内置函数

(defun at-least-one-nonnil-v2 (l)
  (some #'identity l))
但这并不能帮助您了解递归。

那么:

(apply 'or '( your list here )) ;; ?
适用于我。(AutoCAD的AutoLisp)示例:

(repeat 100000 (setq longlist (cons nil longlist)))
然后

这是一个100001元素列表,末尾只有一个非nil元素

(apply 'or longlist) 

返回T。这不是正确答案还是列表不够长?

我接受该注释作为答案。这两个函数实际上不是至少都有一个nil吗?要获得所需的行为,应该从第一个函数中删除最后一个not,并将最后一个函数中的
#not
替换为
#identity
。此外,Common lisp使用
(defun function(args)…
,而
(define(function args)…)
是scheme。虽然此代码可以回答问题,提供关于如何以及为什么解决问题的附加上下文将提高答案的长期价值。这有几个问题:您不能应用
,因为它不是一个函数。如果它是一个函数,那么函数可以接受的参数数量有一个依赖于实现的限制,可能低至50个。所以这不是一个解决方案,如果是的话,恐怕会是一个糟糕的解决方案。对我有效。例如:(重复(setq longlist(cons nil longlist))
(apply 'or longlist)