clojure宏创建||比较呢?

时间:2015-05-18 07:40:16

标签: clojure macros

我想创建一个||与其他语言的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)这是表达式,而不是变量。如何创建||宏?

2 个答案:

答案 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),宏只会获得参数1nil。如果您想要(get a 0)的结果,则应使用(|| '(get a 0) (b))