在克洛朱尔语中,<>真正的是什么



实际上我试图完全理解clojure,尤其是符号

(def a 1)
(type a)
;;=>java.lang.Long
(type 'a)
;;=>clojure.lang.Symbol

我知道type是一个函数,所以首先评估它的参数,所以我完全理解为什么上面的代码以这种方式工作。在流代码中,我决定使用宏延迟评估

(defmacro m-type [x] (type x))
(m-type a)
;;==>clojure.lang.Symbol

我对此很好,但我不能忍受的是:

(m-type 'a)
;;=>clojure.lang.Cons

为什么 'A 的类型是缺点

字符 '被 clojure 阅读器解释为一个读取器宏,它扩展到一个包含符号的列表quote后跟 ',因此在你调用(m-type 'a)时,'a扩展到:

user> (macroexpand-1 ''a)
(quote a) 

然后在列表上调用类型(quote a)这是一个缺点。

如果我们让 m 型宏打印它在评估时看到的参数,这可能会更清楚一些:

user> (defmacro m-type [x] (println "x is " x) (type x))
#'user/m-type
user> (m-type 'a)
x is  (quote a)
clojure.lang.Cons  

相关内容

  • 没有找到相关文章

最新更新