Clojure中#^ {...}和^ {...}元数据之间的区别?

时间:2013-03-24 01:48:55

标签: clojure

考虑

(defn f ^{:foo "bar"} [x] (* x x))

(defn g #^{:foo "bar"} [x] (* x x))

编译和运行。

我有两个问题:第一,为什么(meta f)(meta g)仅产生nil?我原以为他们会产生{:foo "bar"}; i.o.w.,我只是完全在元数据上吃午饭,我在那里定义了一些垃圾吗?

其次,元数据的两个合成元素之间有什么区别?看起来第二个是“tagged literal”,与edn, the extended data notation有关,但如果没有更多的背景或示例,我就不能完全了解它。

1 个答案:

答案 0 :(得分:8)

clojure 1.2中的#^元数据阅读器宏was replaced with ^。虽然目前两者之间没有区别,但旧表单已弃用,您应该只使用^

元数据文字应该之前要附加到的项目:

(defn ^{:foo "bar"} f [x] (* x x))

要记住的另一件事是上面定义中的元数据没有附加到函数,它附加到引用函数的var。您可以使用以下内容获取f var的元数据

(meta (var f))

或使用var阅读器宏:

(meta #'f)