"уменьшить" или "применить" с помощью логических функций в Clojure
Я не могу использовать логические функции в диапазоне булевых элементов в Clojure (1.2). Ни одна из следующих работ из-за того, что логические функции являются макросами:
(reduce and [... sequence of bools ...])
(apply or [... sequence of bools ...])
В сообщении об ошибке говорится, что я не могу принять значение макроса: #'clojure.core/and
". Как применять эти логические функции (макросы) без написания шаблона?
Ответы
Ответ 2
Ответ Michal уже присутствует, но следующий альтернативный подход может быть полезен в подобных ситуациях, когда вы хотите использовать макрос как функцию:
(reduce #(and %1 %2) [... sequence of bools ...])
В основном вы просто переносите макрос в анонимную функцию.
Есть несколько веских причин, чтобы рассмотреть этот подход:
- Бывают ситуации, когда удобная функция типа
some
илиevery?
не существует - Вы можете получить более высокую производительность (сокращение, вероятно, принесет пользу от некоторых очень хороших оптимизаций в будущем, например, применение функции непосредственно к вектору, а не преобразование вектора в последовательность)