В закрытии, как мы можем применить and
или любой другой макрос к списку?
Это не работает:
(apply and '(true false))
Потому что apply
не может принимать значение макроса.
Итак, каков наилучший способ проверить, верны ли все элементы списка?
В закрытии, как мы можем применить and
или любой другой макрос к списку?
Это не работает:
(apply and '(true false))
Потому что apply
не может принимать значение макроса.
Итак, каков наилучший способ проверить, верны ли все элементы списка?
Вместо этого вы можете сделать это:
(every? identity '(true false))
Подробнее см. этот поток.
В Clojure макросы не являются первоклассными вещами, они не составляют совершенно похожие функции, и вы не можете передавать их другим функциям, и вы не можете apply
их. Это происходит потому, что они закончены и сделаны до того, как будет выполнено какое-либо из приложений.
Обычно переносить макросы в функции на apply
или передавать их в функции
(defmacro my-macro [x y z] ...)
(apply #(my-macro %1 %2 %3) [1 2 3])
(map #(my-macro) [1 2 3] [:a :b :c] [a b c])
макрос чтения анонимных функций #(
делает это настолько простым, что макросы, не являющиеся первоклассными, на самом деле не являются неудобством. Просто попробуйте помнить первое правило макро-клуба
Вы также можете сделать это: (apply = true '(true false))
user=> (eval `(and [email protected](list true false)))
false
user=> (eval `(and [email protected] (list true true 1)))
1
Я цитирую синтаксис, а затем применяю большой кувалду, чтобы удалить скобки вокруг коллекции, и, поскольку я процитировал ее, нужно использовать eval. Это полезно, если вы создаете макрос, а переданная функция - "и".
так что (list 1 2 3)
кувалды становятся 1 2 3
.
Это один из способов, чрезвычайно ужасный, но он работает, поэтому я получил это для меня, что приятно. Таким образом, мой clojure не велик, но я надеюсь, что этот пример макроса очистит вещи.
(defmacro split-my-args-then-apply-fn
"This is one terrible macro designed to show the use of 'and'."
[fun coll & args]
`(~fun [email protected]((apply juxt args) coll)))
Использование (никогда):
(split-my-args-then-apply-fn
and
{:something :true :something-else false}
:something :something-else)