documentation on metadata声称^{:hi 10} 'x(with-meta 'x {:hi 10})等效,但我看不到。

评估以下内容,

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

打印以下内容,这表明第一种情况没有附加元数据。
x
^{:hi 10} x

难道我做错了什么?

最佳答案

^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

您可以通过将^放在'之后,将元数据附加到带引号的符号上,如下所示:
user> (prn (read-string "'^{:hi 10} x"))
(quote ^{:hi 10} x)
user> (prn '^{:hi 10} x)
^{:hi 10} x

关于clojure - 为什么^ metadata'符号不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30922413/

10-12 21:32
查看更多