簡體   English   中英

如何在沒有實際打印的情況下從(錯誤)對象生成字符串?

[英]How to generate a string out of an (error)object without actual printing?

我想檢索由write生成的字符串,以便在不進行任何實際輸出的情況下進行進一步處理,但是write似乎總是也輸出到REPL中

CL-USER>(let ((err-string (write (make-instance 'error) :stream nil)))
          (do-awesome-stuff-with-string err-string))
<ERROR> ;;this is the printing I want to get rid of
"awesome-result"

為什么write還是輸出到REPL,以及我如何擺脫呢?

您可以為此使用with-output-to-string 這是一個例子:

(flet ((do-awesome-stuff-with-string (string)
         (concatenate 'string string " is awesome!")))
  (let ((err-string (with-output-to-string (s)
                      (write (make-instance 'error) :stream s))))
    (do-awesome-stuff-with-string err-string)))
;; => "#<ERROR {25813951}> is awesome!"

這里的下面是對HyperSpec進入with-output-to-string

原因(write (make-instance 'error) :stream nil)不起作用是因為write:stream參數是一個流指示符 ,在這種情況下nil*standard-output*簡寫。 format實際上取nil表示它應該返回一個字符串,這是一個常見的混淆點)。

請記住, MAKE-CONDITION產生可移植的錯誤。 該標准沒有說錯誤是CLOS類,因此MAKE-INSTANCE在某些實現中可能不起作用。

有兩種簡單的方法來獲取字符串:

a)文字說明:

CL-USER 15 > (princ-to-string (make-condition 'error))
"The condition #<ERROR 4020311270> occurred"

b)打印的錯誤對象:

CL-USER 16 > (prin1-to-string (make-condition 'error))
"#<ERROR 402031158B>"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM