2012-02-16 33 views
2

我得到了一个列表的列表,我想删除某种列表。因此,我会使用remove-if-not-lambda表达式。但是我可能不需要通过列表中的所有元素来确定它是否应该被删除,因为需要返回来自结论。但我怎么能申请一个匿名lambda函数?是否有可能在lambda函数中使用return-from

(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的,但后来我的问题变得更糟,因为我现在还得回去,从两个半波功能。

+0

如果你在外部lambda上使用alambda,在内部使用lambda,你可以从self返回; checkout mapc – 2012-02-17 00:17:30

回答

3

dolist建立一个隐式块,所以你可以使用return。阅读更多here。另外,您可以使用明确的block来包装dolist,以便您可以使用return-from

+0

块提示是一个完美的结合,谢谢我包围了lambda函数的孔形式的块。 – Sim 2012-02-16 12:05:05

1

您还可以使用格雷厄姆alambda(而不是拉姆达;只需添加的“a”在前面),在情况下,你不会碰巧有一个dolist块从返回:

(remove-if-not 
    (alambda (arg) 
    (dolist (x arg) 
     (when (= x 3) 
     (return-from self t)) 
     nil)) 
    *listlist*) 

这适用于一般情况,在你编写代码的地方,写一个lambda函数,然后碰巧需要命名的lambda表达式,以便你可以返回它。此时,只需向lambda添加一个'a',然后从self返回。

相关问题