【问题标题】:clojure macro create || comparison?clojure 宏创建 ||比较?
【发布时间】:2015-07-29 15:00:00
【问题描述】:

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

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    Clojure 中的 || 是宏 or 。你可以查看它的实现here

    如果你想使用符号||,你可以给or宏起别名:

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

    然后您可以使用:

    (or (get a 0) (b))
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-12
        • 2019-02-26
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        相关资源
        最近更新 更多