«уменьшить» или «применить», используя логические функции в Clojure - PullRequest
30 голосов
/ 23 мая 2010

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

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

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

Ответы [ 2 ]

51 голосов
/ 23 мая 2010

Не - используйте every? и some вместо.

14 голосов
/ 27 сентября 2011

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

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

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

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

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