2015-10-17 19 views

回答

5

該特定格式由clojure.core/print-tagged-object函數(專用於clojure.core)產生,其中clojure.core/print-method的某些實現委託給。 print-method的其他實現不使用print-tagged-object併產生不同的表示 - 例如Clojure的內置數據結構傾向於可表示爲Clojure文字。

矢量的元素表示如下:

  1. 的第一個元素是類的對象。

    Clojure的功能的類,它們的名稱是從命名空間衍生它們在定義的實例:

    (class +) 
    ;= clojure.core$_PLUS_ 
    
  2. 第二個元素是該對象的標識哈希代碼作爲由

    (System/identityHashCode x) 
    
  3. 確定
  4. 最後一個元素是調用print-method關於與對象關聯的輔助值的結果,對於使用#object[…]表示的對象將傾向於歸結爲一個toString通話,雖然也有一些例外:

    (prn (atom {})) 
    ;; #object[clojure.lang.Atom 0x565f390 {:status :ready, :val {}}] 
    
    (str (atom {})) 
    ;= "[email protected]" 
    

    這種特殊的行爲是由從實現這個片段解釋:

    ;; /src/clj/clojure/core_print.clj L410-411 (as of right now) 
    (defmethod print-method clojure.lang.IDeref [o ^Writer w] 
        (print-tagged-object o (deref-as-map o) w)) 
    

    {:status :ready, :val {}}來自deref-as-map通話; deref-as-map是在上面定義的。

見的/src/clj/clojure/core_print.clj對於細節,其餘(鏈接到主分支的電流尖)。

+0

謝謝!有沒有一種方法可以爲所有功能提供這樣的方法? –

+0

@SeanAllred Clojure中「函數」的定義並不完全簡單,因爲有許多類似函數的內置類型('fn'函數,多方法,向量,映射,集合)。所以,你必須定義一個定義併爲適當的類型實現'print-method',然後可能使用prefer-method來解決衝突(例如,爲'clIFn'實現'print-method'使向量使用'prefer-method'選擇不可打印的適用方法之一)。請注意,庫肯定不應該做那樣的事情,即使在應用程序代碼中,我也會很謹慎。 –

+0

僅供參考:[clojure-emacs/cider-nrepl#268](https://github.com/clojure-emacs/cider-nrepl/pull/268)([gitter conversation](https://gitter.im/) Clojure的-的emacs /蘋果酒?在= 562281fe5560144738d6684c)) –