Защо символът ^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