clojure 宏创建 ||比较?

clojure macro create || comparison?

我想创建一个||像其他语言一样与 Clojure 进行比较。

(defmacro ||
  [source & other]
  `(loop [s# [~source ~@other]]
     (println s#)
     (let [fs# (first s#)]
       (if fs#
         fs#
         (if (= (count s#) 1)
           fs#
           (recur (next s#)))))))

但这行不通。 fs# 值为报价数据。

像这样

(def a [1])
(defn b []
  (println 11111))

(|| (get a 0) (b))

我希望结果为 1,这是 (get a 0) 但结果是 (get a 0) 这是表达式,而不是变量。我如何创建 ||宏?

Clojure 中 || 的等价物是宏 or . You can view its implementation here.

如果你想使用符号 ||,你可以只为 or 宏设置别名:

(def #^{:macro true} || #'or)

然后您可以使用:

(or (get a 0) (b))

(|| (get a 0) (b))

您的预期结果是什么,(get a 0)1?在我的机器上,您的代码的结果是 1。我认为这与宏无关。在扩展宏 (|| (get a 0) (b)) 之前,(get a 0)(b) 将被计算,宏只得到参数 1nil。如果你想要 (get a 0) 的结果,你应该使用 (|| '(get a 0) (b))