lisp应用附加
我使用此函数从列表x中删除数字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
(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))