我想创建一个||与其他语言的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 #value是引用数据。
像这样(def a [1])
(defn b []
(println 11111))
(|| (get a 0) (b))
我希望结果为1,这是(get a 0)
但结果是(get a 0)
这是表达式,而不是变量。如何创建||宏?
答案 0 :(得分:3)
Clojure相当于||
是宏or
。您可以查看其实施here。
如果您想使用符号||
,则可以为or
宏添加别名:
(def #^{:macro true} || #'or)
然后您可以使用:
(or (get a 0) (b))
或
(|| (get a 0) (b))
答案 1 :(得分:0)
您的预期结果是什么,(get a 0)
或1
?在我的计算机上,代码的结果为1
。我认为这与宏没有任何关系。在展开宏(|| (get a 0) (b))
之前,将评估(get a 0)
和(b)
,宏只会获得参数1
和nil
。如果您想要(get a 0)
的结果,则应使用(|| '(get a 0) (b))