考虑

(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/

10-15 00:56