为什么 ^metadata '符号不起作用?
Why does ^metadata 'symbol not work?
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
我是不是做错了什么?
^
是一个 reader macro,它将元数据附加到它后面的表单中。但是,'x
不是可以应用元数据的形式;它通过 '
reader 宏扩展为 (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
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
我是不是做错了什么?
^
是一个 reader macro,它将元数据附加到它后面的表单中。但是,'x
不是可以应用元数据的形式;它通过 '
reader 宏扩展为 (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