考虑
(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有关,但如果没有更多的背景或示例,我就不能完全了解它。
答案 0 :(得分:8)
clojure 1.2中的#^
元数据阅读器宏was replaced with ^
。虽然目前两者之间没有区别,但旧表单已弃用,您应该只使用^
。
元数据文字应该之前要附加到的项目:
(defn ^{:foo "bar"} f [x] (* x x))
要记住的另一件事是上面定义中的元数据没有附加到函数,它附加到引用函数的var
。您可以使用以下内容获取f
var
的元数据
(meta (var f))
或使用var
阅读器宏:
(meta #'f)