Я наконец-то изучаю Box2D (используя порт cljbox2d а>). Во время моих тестов «hello world» я обнаружил необходимость в функции, которая проверяет список ящиков, уничтожая и удаляя из списка те, которые выходят за пределы.
Основная функция, которую я написал для обработки этого, это *
:
(defn handle-out-of-bounds! [boxes]
(filterv (fn [{:keys [body]}]
(when-not (inbounds? (bc/position body))
(bc/destroy! body)))
boxes))
Здесь следует отметить, что destroy!
, как следует из его названия, имеет побочные эффекты.
Я решил для удовольствия проверить источник filterv
, так как на самом деле у меня его никогда не было, и заметил, что в строке документа было предупреждение:
. . . pred не должен иметь побочных эффектов.
Почему? filter
Понятно. Это лениво, поэтому у вас нет гарантии, что предикат действительно будет выполняться в любой момент, если вы явно не форсируете оценку. filterv
однако строгое сокращение по списку; внутренне с использованием переходного вектора. Единственное, что вызывает подозрения, это использование переходных процессов, но я не вижу, как это на что-то повлияет.
Есть ли на самом деле веская причина не выполнять побочные эффекты в предикате filterv
или это просто концептуальная причина?
*
После написания я понял, что моя логика не работает, и что эта функция на самом деле сломана, но это не главное. Я мог бы также справиться с уничтожением и удалением отдельно, но опять же, это не вопрос.