(pr +)
;=> #object[clojure.core$_PLUS_ 0x4e648e99 "[email protected]"]
有了更復雜的例子,這似乎是一個統一的模式:(pr raw-object)中的不同部分是什麼?
#object[namespace$symbol addr "[email protected]"]
什麼是這裏的第三個元素的目的是什麼?它何時不遵循這種模式?
(pr +)
;=> #object[clojure.core$_PLUS_ 0x4e648e99 "[email protected]"]
有了更復雜的例子,這似乎是一個統一的模式:(pr raw-object)中的不同部分是什麼?
#object[namespace$symbol addr "[email protected]"]
什麼是這裏的第三個元素的目的是什麼?它何時不遵循這種模式?
該特定格式由clojure.core/print-tagged-object
函數(專用於clojure.core
)產生,其中clojure.core/print-method
的某些實現委託給。 print-method
的其他實現不使用print-tagged-object
併產生不同的表示 - 例如Clojure的內置數據結構傾向於可表示爲Clojure文字。
矢量的元素表示如下:
的第一個元素是類的對象。
Clojure的功能的類,它們的名稱是從命名空間衍生它們在定義的實例:
(class +)
;= clojure.core$_PLUS_
第二個元素是該對象的標識哈希代碼作爲由
(System/identityHashCode x)
最後一個元素是調用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
對於細節,其餘(鏈接到主分支的電流尖)。
謝謝!有沒有一種方法可以爲所有功能提供這樣的方法? –
@SeanAllred Clojure中「函數」的定義並不完全簡單,因爲有許多類似函數的內置類型('fn'函數,多方法,向量,映射,集合)。所以,你必須定義一個定義併爲適當的類型實現'print-method',然後可能使用prefer-method來解決衝突(例如,爲'clIFn'實現'print-method'使向量使用'prefer-method'選擇不可打印的適用方法之一)。請注意,庫肯定不應該做那樣的事情,即使在應用程序代碼中,我也會很謹慎。 –
僅供參考:[clojure-emacs/cider-nrepl#268](https://github.com/clojure-emacs/cider-nrepl/pull/268)([gitter conversation](https://gitter.im/) Clojure的-的emacs /蘋果酒?在= 562281fe5560144738d6684c)) –