我有一个列表列表,我想删除某些列表。因此我会使用带有lambda表达式的remove-if-not。但是我可能不需要遍历列表中的所有元素来确定它是否应该被删除,作为结论需要返回。但是如何在匿名lambda函数中应用一个?
(defvar *listlist* (list (list 1 2 3) (list 3 4 5) (list 5 6 7) (list 7 8 9)))
(remove-if-not #'(lambda (arg)
(dolist (x arg)
(when (= x 3)
(return-from lambda t)))
nil)
*listlist*)
另一件事,困扰我的是可能使用mapcar而不是dolist,但随后我的问题变得更糟,因为我现在必须从两个lambda函数返回。
答案 0 :(得分:3)
dolist
建立隐式阻止,因此您可以使用return
。阅读更多here。此外,您可以将dolist
括在显式block
中,以便使用return-from
。
答案 1 :(得分:1)
你也可以使用格雷厄姆的alambda(而不是lambda;只需在前面添加'a'),如果你碰巧没有一个dolist块来返回:
(remove-if-not
(alambda (arg)
(dolist (x arg)
(when (= x 3)
(return-from self t))
nil))
*listlist*)
这适用于一般情况,你正在编写代码,并编写lambda函数,然后你碰巧需要命名的lambda,以便你可以从中返回。此时,只需在lambda中添加一个'a',然后从self返回。