Почему предикат filterv не должен иметь побочных эффектов?

Я наконец-то изучаю 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 или это просто концептуальная причина?


* После написания я понял, что моя логика не работает, и что эта функция на самом деле сломана, но это не главное. Я мог бы также справиться с уничтожением и удалением отдельно, но опять же, это не вопрос.


person Carcigenicate    schedule 22.08.2018    source источник


Ответы (1)


Другие люди ломали голову над этим раньше, см., например, тот же вопрос в этом списке рассылки. сообщение.

Те, кто прокомментировал, также, похоже, согласны с тем, что рассматриваемое заявление немотивировано. filterv не терпится, побочный эффект pred не проблематичен.

Если утверждение неверно, вероятным объяснением является простая ошибка копирования и вставки в строке документа. mapv и filterv были представлены Стюартом Хэллоуэем, который просто скопировал строки документа map и filter с заменой «ленивой последовательности» на «вектор».

person glts    schedule 22.08.2018
comment
Поскольку это предположение, я подожду, чтобы узнать, появится ли что-нибудь еще, но я не удивлюсь, если вы правы. - person Carcigenicate; 22.08.2018
comment
Я открыл CLJ-2452… посмотрим, как пойдет. - person glts; 10.12.2018
comment
Хорошо, спасибо. Было бы неплохо уточнить/исправить это. - person Carcigenicate; 10.12.2018