(defun filter-numbers-rec (inlist)
  "This function filters out non-numbers from its input list and returns
the result, a list of numbers"
  (cond
    ((not (listp inlist))
     (princ "Argument must be a list")
     (terpri)
     ())
    ((null inlist)
     ())
    ((not (numberp (car inlist)))
     (filter-numbers-rec (cdr inlist)))
    (t
     (cons (car inlist)
           (filter-numbers-rec (cdr inlist))))))

最佳答案

好吧,这个函数所做的描述是,如果不是数字,您希望从列表中删除每一个对象,因此这里的一个好候选对象是remove-if-not,您可以使用如下:

(remove-if-not 'numberp '(1 a 2 b 3 c #\x (y 4)))
;=> (1 2 3)

如果出于某种原因,您希望以一种(可能)不使用递归的方式编写此代码,则可以使用do
(do ((list '(1 a 2 b 3 c #\x (y 4)) (rest list))
     (result '()))
    ((endp list) (nreverse result))
  (when (numberp (car list))
    (push (car list) result)))
;=> (1 2 3)

如果您不喜欢do的措辞,可以使用loop
(loop :for x :in '(1 a 2 b 3 c #\x (y 4))
   :when (numberp x)
   :collect x)
;=> (1 2 3)

09-04 02:18