Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure宏创建| |比较?_Clojure_Macros - Fatal编程技术网

clojure宏创建| |比较?

clojure宏创建| |比较?,clojure,macros,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#))))))) 但这

我想和其他语言一样,与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,这是
(得到一个0)
,但结果是
(得到一个0)
这是表达式,而不是变量。如何创建一个| |宏?

Clojure的等价物
|
就是宏。您可以查看它的实现

如果要使用符号
|
,只需将
宏别名为:

(def #^{:macro true} || #'or)
然后,您可以使用:

(or (get a 0) (b))


Clojure与
|
的等价物是宏。您可以查看它的实现

如果要使用符号
|
,只需将
宏别名为:

(def #^{:macro true} || #'or)
然后,您可以使用:

(or (get a 0) (b))


Clojure与
|
的等价物是宏。您可以查看它的实现

如果要使用符号
|
,只需将
宏别名为:

(def #^{:macro true} || #'or)
然后,您可以使用:

(or (get a 0) (b))


Clojure与
|
的等价物是宏。您可以查看它的实现

如果要使用符号
|
,只需将
宏别名为:

(def #^{:macro true} || #'or)
然后,您可以使用:

(or (get a 0) (b))


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