是否可以在lambda函数中使用return-from

时间:2012-02-16 11:47:22

标签: lambda common-lisp

我有一个列表列表,我想删除某些列表。因此我会使用带有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函数返回。

2 个答案:

答案 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返回。