[英]Printing a string in Common Lisp, after concatening function format with recursion
[英]Surprise printing to string (common lisp)
按照WITH-OUTPUT-TO-STRING和GET-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以兩種不同的方式返回值:
NIL
,那么它會創建一個字符串並返回它。 你的代碼:
(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.