【问题标题】:in clojure language what <'a> really is在 clojure 语言中 <'a> 到底是什么
【发布时间】:2014-01-23 17:26:39
【问题描述】:

实际上我正在尝试完全理解 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 的类型是缺点

【问题讨论】:

  • 投票关闭为“太宽泛”的用户你能证明你的决定是正确的吗?这有一个具体而简单的答案
  • 也许有人只看了标题?

标签: macros clojure symbols cons


【解决方案1】:

字符 ' 被 clojure 阅读器解释为一个阅读器宏,它扩展为包含符号 quote 后跟 ' 的任何内容的列表,因此在您对 (m-type 'a) 的调用中 'a 扩展为:

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

然后调用列表中的类型(quote a),这是一个缺点。

如果我们让 m-type 宏在评估时打印参数,这可能会更清楚一点:

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  

【讨论】:

  • 我认为 OP 仍然会对 (type 'a) 的结果感到困惑 - 没有宏的调用 -
  • 这是一个很好的观点,其中有宏扩展和引用。
  • 他很可能会再次问为什么 (type 'a) 返回 clojure.lang.Symbol 。但我不是魔术师!
  • 我不是 OP,我明白了
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多