2015-06-18 1 views
3

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 

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

ответ

3

^ - 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