Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中^{…}和^{…}元数据之间的差异?_Clojure - Fatal编程技术网

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)