Можно ли использовать возврат изнутри лямбда-функции - PullRequest
2 голосов
/ 16 февраля 2012

У меня есть список списков, и я хочу удалить определенный вид этих списков.Поэтому я бы использовал удаление-если-не с лямбда-выражением.Но мне может не понадобиться просматривать все элементы списка, чтобы определить, должен ли он быть удален или нет, так как вывод необходим для возврата.Но как я могу применить один в анонимной лямбда-функции?

(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, но тогда моя проблема становится еще хуже, как я бы сейчасвернуться из двух лямбда-функций.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

dolist устанавливает неявный блок, поэтому вы можете использовать return.Подробнее здесь .Кроме того, вы можете обернуть dolist в явном виде block, чтобы вы могли использовать return-from.

1 голос
/ 17 февраля 2012

Вы также можете использовать alambda Грэма (вместо лямбды; просто добавьте 'a' спереди), в случаях, когда у вас нет блока для возврата из:

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

Это работает в общем случае, когда вы кодируете и пишете лямбда-функцию, а затем вам понадобится лямбда, названная так, чтобы вы могли вернуться из нее.В этот момент просто добавьте «a» к лямбде и вернитесь от себя.

...