【问题标题】:Why does ^metadata 'symbol not work?为什么 ^metadata 的符号不起作用?
【发布时间】:2023-04-01 20:56:01
【问题描述】:
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
我做错了吗?
【问题讨论】:
标签:
clojure
metadata
read-eval-print-loop
【解决方案1】:
^ 是一个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