4

考虑

(defn f ^{:foo "bar"} [x] (* x x))

(defn g #^{:foo "bar"} [x] (* x x))

既编译又运行。

我有两个问题:首先,为什么只做(meta f)(meta g)生产nil?我原以为他们会生产{:foo "bar"};iow,我是不是完全在元数据上吃午饭,并且我在那里定义了某种垃圾?

其次,元数据的两种语法有什么区别?看起来第二个是“标记文字”,与edn(扩展数据表示法)有关,但如果没有更多上下文或示例,我无法完全理解它。

4

1 回答 1

8

#^数据阅读器宏在 clojure 1.2 中被替换为。 ^虽然目前两者之间没有区别,但旧形式已被弃用,您应该^独占使用。

元数据文字应该出现在要附加到的项目之前:

(defn ^{:foo "bar"} f [x] (* x x))

要记住的另一件事是,上述定义中的元数据没有附加到函数,它附加到var引用函数的那个​​。您可以通过以下方式获取元数据f var

(meta (var f))

或使用var阅读器宏:

(meta #'f)
于 2013-03-24T02:12:06.547 回答