3

我用这个函数从列表 x 中删除数字

(defun rm-nums (x)
  (cond
    ((null x) nil)
    (t (mapcar 'numberp x))))

但是当我输入(rm-nums '(32 A T 4 3 E)) 返回时(T NIL NIL T T NIL)

我想要它而不是返回 T 或 Nil,我希望它只返回导致 NIL 的值 [不是数字] 所以这个例子应该返回(A T E) 我应该使用 mapcar 而不使用递归或迭代或 bultin 函数“remove-if "

我认为它与一种叫做 apply-append 的东西有关,但我对此一无所知。有什么帮助吗?

4

1 回答 1

5

我认为您的课程考虑到了一点:

(defun my-remove-if (pred lst)
  (apply #'append (mapcar (lambda (x)
                            (and (not (funcall pred x))
                                 (list x)))
                          lst)))

它确实使用applyandappendmapcar,就像你说的那样。示例用法:

(my-remove-if #'numberp '(32 a t 4 3 e))
=> (a t e)

Rörd 建议的更惯用的解决方案:

(defun my-remove-if (pred lst)
  (mapcan (lambda (x)
            (and (not (funcall pred x))
                 (list x)))
          lst))
于 2012-11-21T07:51:17.813 回答