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

В clojure, как применить "и" к списку?

В закрытии, как мы можем применить and или любой другой макрос к списку?

Это не работает:

(apply and '(true false))

Потому что apply не может принимать значение макроса.

Итак, каков наилучший способ проверить, верны ли все элементы списка?

4b9b3361

Ответ 1

Вместо этого вы можете сделать это:

(every? identity '(true false))

Подробнее см. этот поток.

Ответ 2

В 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])

макрос чтения анонимных функций #( делает это настолько простым, что макросы, не являющиеся первоклассными, на самом деле не являются неудобством. Просто попробуйте помнить первое правило макро-клуба

Ответ 3

Вы также можете сделать это:   (apply = true '(true false))

Ответ 4

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)