漂亮的印刷本地圖出來很醜陋:自定義地圖的印刷:類型Clojure中
{:type :move,
:name :boost,
:from
{:nodeid :plus,
:name :left-operand,
:value
{:args [:result :right-operand],
:f
#object[fargish.workspace_test$fn__159675$fn__159678 0xb3f518f "[email protected]"]},
:dockclass :input,
:ref [:plus :left-operand]},
:to
{:nodeid :source11,
:name :output,
:value 11,
:dockclass :output,
:ref [:source11 :output]},
:do
#object[fargish.workspace$do_boost 0x179d226e "[email protected]"],
:do-hypothetically
#object[fargish.workspace$do_hypothetical_boost 0x68d6475a "[email protected]"]}
大多數時候,我並不需要看到的大部分是。我想它看起來大致是這樣的:
#boost{:from [:plus :left-operand] :to [:source11 :output]}
是否Clojure中提供了一個鉤子,讓我插入代碼,這樣,如果一個地圖的:type
鍵的值是:move
,str
將調用一個函數我寫的生成字符串?
我查看過print-method
。如果我正確地理解了這一點,那將擴展一種派生於論證類型的多方法,即, clojure.lang.PersistentArrayMap,而不是地圖的:type
。 AFAIK,沒有辦法「轉發」到先前定義的多方法,否則我可以爲看到:type
的clojure.lang.PersistentArrayMap編寫print-method
,然後在其值不是:move
時調用通用方法。
即使只是自定義pprint
會有所幫助。理論上,pprint
是非常可定製的,但我還沒有找到解釋如何解決的documentation。 This不完整,並暗示pprint
不是真的完成。
影響pprint
的輸出會很好,但並非嚴格必要。只要能夠影響str
和print
將是一個很大的幫助。
這是否適用於漂亮的打印? –
恐怕你自己用pprint。它的使用幾乎不像核心打印設備那麼多,我相信因爲這個原因,它不那麼靈活:更少的人關心擴展它。我認爲你可以做的最好的是:定義一種新的pprint調度方法來代替簡單調度,在你的調度中實現你想要的任何自定義的東西,然後將其他決策委託給簡單調度。但它並不像打印方法那麼簡單,因爲它默認不考慮元數據。 – amalloy
然後你應該寫這個答案。 OP明確詢問了pprint。 –