Clojure中^{…}和^{…}元数据之间的差异?
考虑Clojure中^{…}和^{…}元数据之间的差异?,clojure,Clojure,考虑 (defn f ^{:foo "bar"} [x] (* x x)) 及 编译和运行 我有两个问题:第一,为什么(metaf)和(metag)只产生nil?我本以为他们会制作{:foo“bar};i、 哦,我是不是已经完全出去吃元数据午餐了?我是否定义了某种垃圾 其次,元数据的两个语法之间有什么区别?第二个看起来像是一个“,”之类的东西,但如果没有更多的上下文或示例,我就无法完全理解它。clojure 1.2中的#^元数据读取器宏^。虽然目前两者之间没有区别,但旧表单已被弃用,您应该专门
(defn f ^{:foo "bar"} [x] (* x x))
及
编译和运行
我有两个问题:第一,为什么(metaf)
和(metag)
只产生nil
?我本以为他们会制作{:foo“bar}
;i、 哦,我是不是已经完全出去吃元数据午餐了?我是否定义了某种垃圾
其次,元数据的两个语法之间有什么区别?第二个看起来像是一个“,”之类的东西,但如果没有更多的上下文或示例,我就无法完全理解它。clojure 1.2中的#^
元数据读取器宏^
。虽然目前两者之间没有区别,但旧表单已被弃用,您应该专门使用^
元数据文本应位于要附加到的项之前:
(defn ^{:foo "bar"} f [x] (* x x))
要记住的另一件事是,上面定义中的元数据并没有附加到函数,而是附加到引用函数的var
。您可以通过以下方式获取f
var
的元数据:
(meta (var f))
或者使用var
读卡器宏:
(meta #'f)
谢谢你的回答。我在看
(doc defn)
,它说名称在元数据之前,除非我读错了文档:“clojure.core/defn([name doc string?attr map?[params*]prepost map?body][name doc string?attr map?([params*]prepost map?body)+attr map?])”attr-map
是defn
宏的一个特殊功能,该功能可以使将元数据附加到定义的var变得更容易。使用attr map
时,不应在map前面加^
((defn f{:foo“bar”}[]:baz)
)。我在任何地方都没有见过这种用法,使用^
阅读器宏更为常见。我猜attr-map
在旧版本的clojure中很有用,因为处理元数据不太美观,但是现在使用^{:foo“bar}
表单更为惯用和通用(您可以将它放在任何可以保存元数据的对象之前)。
(meta #'f)