Подтвердить что ты не робот

"уменьшить" или "применить" с помощью логических функций в Clojure

Я не могу использовать логические функции в диапазоне булевых элементов в Clojure (1.2). Ни одна из следующих работ из-за того, что логические функции являются макросами:

(reduce and [... sequence of bools ...])
(apply or [... sequence of bools ...])

В сообщении об ошибке говорится, что я не могу принять значение макроса: #'clojure.core/and ". Как применять эти логические функции (макросы) без написания шаблона?

4b9b3361

Ответ 1

Не использовать every? и some.

Ответ 2

Ответ Michal уже присутствует, но следующий альтернативный подход может быть полезен в подобных ситуациях, когда вы хотите использовать макрос как функцию:

(reduce #(and %1 %2) [... sequence of bools ...])

В основном вы просто переносите макрос в анонимную функцию.

Есть несколько веских причин, чтобы рассмотреть этот подход:

  • Бывают ситуации, когда удобная функция типа some или every? не существует
  • Вы можете получить более высокую производительность (сокращение, вероятно, принесет пользу от некоторых очень хороших оптимизаций в будущем, например, применение функции непосредственно к вектору, а не преобразование вектора в последовательность)