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)
将被计算,宏只得到参数 1
和 nil
。如果你想要 (get a 0)
的结果,你应该使用 (|| '(get a 0) (b))
我想创建一个||像其他语言一样与 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)
将被计算,宏只得到参数 1
和 nil
。如果你想要 (get a 0)
的结果,你应该使用 (|| '(get a 0) (b))