考虑
(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 有关,但如果没有更多上下文或示例,我无法完全解决它。
最佳答案
clojure 1.2 中的 #^
元数据阅读器宏 was replaced with ^
。虽然目前两者之间没有区别,但旧形式已被弃用,您应该只使用 ^
。
元数据文字应该出现在它要附加到的项目之前:
(defn ^{:foo "bar"} f [x] (* x x))
要记住的另一件事是,上述定义中的元数据没有附加到函数,而是附加到引用函数的
var
上。您可以通过以下方式获取 f
var
的元数据:(meta (var f))
或者使用
var
阅读器宏:(meta #'f)
关于clojure - Clojure 中#^{...} 和 ^{...} 元数据之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15594278/