Clojure“;及;宏作为符号

Clojure“;及;宏作为符号,clojure,Clojure,为什么以下语句返回不同的结果?此外,如何编写第二条语句以获得false的预期结果 (clojure.core/and false true) => false ((resolve 'clojure.core/and) false true) => true freenode上clojure的好心人帮我回答了问题。 首先,应该避免在运行时解析宏。 其次,宏函数被实现为一个函数,除了任何(&)参数外,它还接受两个参数。因此,编写上述第二条语句的正确方法是 ((resolve 'clo

为什么以下语句返回不同的结果?此外,如何编写第二条语句以获得false的预期结果

(clojure.core/and false true)
=> false

((resolve 'clojure.core/and) false true)
=> true
freenode上clojure的好心人帮我回答了问题。 首先,应该避免在运行时解析宏。 其次,宏函数被实现为一个函数,除了任何(&)参数外,它还接受两个参数。因此,编写上述第二条语句的正确方法是

((resolve 'clojure.core/and) nil nil false true) => 
**(clojure.core/let [and__3973__auto__ false] (if and__3973__auto__ (clojure.core/and true) and__3973__auto__))**
由于我们仍在使用宏,它只是将其扩展为代码,而不是返回实际值。 之所以将其作为宏实现,是为了使短路成为可能。 您可以从REPL中看到:

(defmacro and
  "Evaluates exprs one at a time, from left to right. If a form
  returns logical false (nil or false), and returns that value and
  doesn't evaluate any of the other expressions, otherwise it returns
  the value of the last expr. (and) returns true."
  {:added "1.0"}
  ([] true)
  ([x] x)
  ([x & next]
   `(let [and# ~x]
      (if and# (and ~@next) and#))))
如果没有宏,AND函数将计算给定给它的所有谓词,而不会发生短路。 在我的特殊情况下,这正是我所需要的;用于和或非短路功能。 以下是两个功能,以防任何人需要它们:

(defn and* [& xs] (every? identity xs))
(defn or* [& xs] (not= (some true? xs) nil))