Почему символ ^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

Я делаю что-то неправильно?


person Malabarba    schedule 18.06.2015    source источник


Ответы (1)


^ — это макрос чтения, который прикрепляет метаданные к следующей за ним форме. Однако '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
person Alex    schedule 18.06.2015