2012-02-16 62 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返回。

相關問題