为什么^元数据'符号不起作用?

时间:2015-06-18 17:55:34

标签: clojure metadata read-eval-print-loop

documentation on metadata声明^{:hi 10} 'x等同于(with-meta 'x {:hi 10}),但我无法看到。

在repl上评估以下内容,

(binding [*print-meta* true]
  (prn ^{:hi 10} 'x)
  (prn (with-meta 'x {:hi 10})))

打印以下内容,表明第一个案例没有附加元数据。

x
^{:hi 10} x

我做错了吗?

1 个答案:

答案 0 :(得分:5)

^reader macro,它将元数据附加到其后的表单中。但是,'x不是可以应用元数据的表单;它通过(quote x)阅读器宏扩展为'。当您输入^{:hi 10} 'x时,元数据会附加到未评估的(quote x)表单,而不会附加到空符号x

user> (set! *print-meta* true)
user> (prn (read-string "'x"))
(quote x)
user> (prn (read-string "^{:hi 10} 'x"))
^{:hi 10} (quote x)

但是,使用元数据评估表单不会将元数据传递给结果:

 user> (prn (eval (read-string "^{:hi 10} 'x")))
 x

您可以在<{1}} 之后放置^ ,将元数据附加到带引号的符号,如下所示:

'