簡體   English   中英

驚喜打印到字符串(常見的lisp)

[英]Surprise printing to string (common lisp)

按照WITH-OUTPUT-TO-STRINGGET-OUTPUT-STREAM-STRING的文檔,我希望以下內容可以正常工作,它們可以:

(print
 (with-output-to-string (sb nil)
   (format sb "~A " "hello, ")
   (format sb "~A~&" "world")
   sb))

(print
 (let ((sb (make-string-output-stream)))
   (format sb "~A " "hello, ")
   (format sb "~A~&" "world")
   (get-output-stream-string sb)))

但是,以下內容與WITH-OUTPUT-TO-STRING中的一個示例相近,不會:

(print
 (with-output-to-string (sb (make-array
                             '(0)
                             :element-type 'base-char
                             :fill-pointer 0
                             :adjustable t))
   (format sb "~A " "hello, ")
   (format sb "~A~&" "world")
   sb))

相反,生成輸出流本身,而不是生成的字符串:

#<SB-IMPL::FILL-POINTER-OUTPUT-STREAM {1005FBE523}>

我一直無法找到在輸出流中提取字符串的方法。 我懷疑它與動態范圍有關,但我的理解在這里躊躇不前。

顯然,我有更好的方法來達到預期的結果,所以我只是好奇地發現我對語言的誤解。

由於文件說,結果是不確定的,用於在流GET-OUTPUT-STREAM-STRING 不是 MAKE-STRING-OUTPUT-STREAM創建的,我並不感到驚訝,下面不工作:

(print
 (with-output-to-string (sb (make-array
                             '(0)
                             :element-type 'base-char
                             :fill-pointer 0
                             :adjustable t))
   (format sb "~A " "hello, ")
   (format sb "~A~&" "world")
   (get-output-stream-string sb)))

但我仍然很感激在第三個例子中找到一種提取字符串的方法。

請注意, WITH-OUTPUT-TO-STRING以兩種不同的方式返回值:

  1. 如果你沒有給它字符串或NIL ,那么它會創建一個字符串並返回它。
  2. 如果你給它一個字符串,那么它返回最后一個體形的結果值。

你的代碼:

(print
 (with-output-to-string (sb (make-array   ; creates a string
                             '(0)
                             :element-type 'base-char
                             :fill-pointer 0
                             :adjustable t))
   (format sb "~A " "hello, ")
   (format sb "~A~&" "world")
   sb)   ; you return the stream (which makes not much sense), but not the string
   )

您已通過調用MAKE-ARRAY創建了一個字符串。 它就是。 用它。 為此,您通常需要將其綁定到某個變量。

示例如何返回字符串:

(let ((s (make-array '(0)
                     :element-type 'base-char
                     :fill-pointer 0
                     :adjustable t)))
  (with-output-to-string (sb s)
    (format sb "~A " "hello, ")
    (format sb "~A~&" "world"))
  s)

要么

(let ((s (make-array '(0)
                     :element-type 'base-char
                     :fill-pointer 0
                     :adjustable t)))
  (with-output-to-string (sb s)
    (format sb "~A " "hello, ")
    (format sb "~A~&" "world")
    s))

在最后一種情況下, with-output-to-string返回值,因為它有一個字符串,用作輸出的目標。

暫無
暫無

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

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