【问题标题】:Is it possible to use return-from inside a lambda function是否可以在 lambda 函数中使用 return-from
【发布时间】:2012-02-16 11:47:21
【问题描述】:

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

【问题讨论】:

  • 如果在外层 lambda 上使用 alambda,在内层使用 lambda,则可以 return-from self;结帐 mapc 的内部

标签: lambda common-lisp


【解决方案1】:

dolist 建立一个隐式块,所以你可以使用return。阅读更多here。此外,您可以将dolist 包装在显式block 中,这样您就可以使用return-from

【讨论】:

  • 块提示非常合适,谢谢我在 lambda 函数的孔形式周围包裹了一个块。
【解决方案2】:

您也可以使用 Graham 的 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 中返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2021-08-05
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多