lisp应用附加

lisp应用附加,lisp,append,apply,Lisp,Append,Apply,我使用此函数从列表x中删除数字 (defun rm-nums (x) (cond ((null x) nil) (t (mapcar 'numberp x)))) 但是,当我输入(rm nums'(32 A T 4 3 E)) 返回(T NIL T NIL) 我希望它不是返回T或Nil,而是只返回导致Nil的值[不是数字] 所以这个例子应该返回(A T E) 我应该使用mapcar而不使用递归或迭代,或者bultin函数“remove if” 我认为它与一种叫做apply

我使用此函数从列表x中删除数字

(defun rm-nums (x)
  (cond
    ((null x) nil)
    (t (mapcar 'numberp x))))
但是,当我输入
(rm nums'(32 A T 4 3 E))
返回
(T NIL T NIL)

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

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

我想你的课程考虑到了这一点:

它确实使用了
apply
append
mapcar
,就像你说的那样。用法示例:

(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))

numberp
是一个谓词,用于测试某物是否是一个数字,这就是为什么会出现
t
nil
的列表。在中查找
remove if not
。我知道号码,但我忘了提到我不应该使用内置的“remove if”功能组合
(apply#'append(mapcar…)
的效果也是通过标准函数
(mapcan…
实现的。(好吧,它实际上更像是
(apply#'ncoc(mapcar…)
,但只要您只从传递给它的函数返回新创建的列表,就可以了。)@Rörd我添加了一个基于
mapcan
的解决方案。没错,在这种情况下,所有列表要么是新分配的,要么是零。
(defun my-remove-if (pred lst)
  (mapcan (lambda (x)
            (and (not (funcall pred x))
                 (list x)))
          lst))