2015-04-06 102 views
1

我正在使用pr-str來打印EDN以便與客戶端進行字符串和通信。遇到非常有趣的行爲,其中pr-str還輸出混合到EDN字符串表示中的printlnclojure.tools.trace/trace消息。這是什麼樣的字符串pr-str輸出:pr-str還打印出跟蹤消息

(TRACE from-ds {:key "asdasf", :weight 0, :tag "1"} ; trace message 

{:key "asdasf", :weight 0, :tag "1"}) ; the actual edn that should be the sole output 

我似乎無法重現這個在REPL。

這是怎麼發生的?如何解決它?

+0

'println' [有競爭條件](http://yellerapp.com/posts/2014-12-11-14-race-condition-in-clojure-println.html)? – 2015-04-06 11:09:00

+0

'print'(和擴展名'println')沒有協調來防止重疊輸出,但是隻有當你的'pr-str'調用中的代碼正在創建輸出時,你纔會得到這個結果。查看我的答案瞭解更多詳情。 – noisesmith 2015-04-06 16:13:18

回答

2

pr-str使用with-out-str,它捕獲塊內發生的任何打印輸出並將其轉換爲返回的字符串。

with-out-str創建*out*的線程本地綁定。正因爲如此,您可能在輸出字符串中獲取日誌輸出的唯一方法是,如果pr-str調用中的代碼正在進行日誌記錄。這可以通過綁定pr-str呼叫以外的值然後在該值上呼叫pr-str來解決。

例如。

(let [the-value (generate-some-value) ; this prints something 
     value-string (pr-str the-value)] ; this doesn't have trace output 
    ...)