2012-06-14 27 views
2

我在Clojure 1.3中使用了Leiningen 2 REPL。 我收到了與元數據不一致的行爲(或者我認爲)。Clojure/lein repl&Metadata - 這是一個錯誤,並且在哪裏?

如果這是因爲它應該是,請解釋。如果沒有 - 我應該在哪裏提交錯誤?

這是元代應該如何工作,AFAIK。

main=> (def a ^:inited [ 1 2 3]) 
main=> (meta a) 
{:inited true} 

這就是我引用一個引用空序列時得到的結果。

main=> (def a ^:inited '()) 
main=> (meta a) 
nil 

main=> (def a ^{:inited (System/currentTimeMillis)} '()) 
main=> (meta a) 
nil 

對於沒有引號的空序列,一切都很好。但是,我得到了行號。

main=> (def a ^{:inited (System/currentTimeMillis)}()) 
main=> (meta a) 
{:inited 1339678437612, :line 1} 

main=> (def a ^:inited ()) 
main=> (meta a) 
{:inited true, :line 1} 

在這裏,我沒有得到行號:

main=> (def a ^:inited [ 1 2 3]) 
main=> (meta a) 
{:inited true} 

main=> (def a ^{:inited (System/currentTimeMillis)} [1 2 3]) 
main=> (meta a) 
{:inited 1339678534644} 

回答

1

'是讀者宏觀其擴展爲(quote ...)。所以你把元數據放在列表中。試試這個:

user=> (def a ' ^:inited []) 
#'user/a 
user=> (meta a) 
{:tag :inited} 
user=> (def a ^:inited '[]) 
#'user/a 
user=> (meta a) 
nil 

Shameless self-promotion.

+0

哈哈。是。當然。應該看到了。 (關於行號的任何提示?) – Falko

+0

它們由編譯器添加以進行錯誤報告。列表用於函數調用。 – kotarak