iHo*_*ell 5 lisp common-lisp gnu-common-lisp
我目前正在尝试获得... \hlineGNU Common lisp 2.49 的输出,但我无法使格式工作.这是我到目前为止尝试获得一个反斜杠:
(format nil "\ ") => " "
(format nil "\\ ") => "\\ "
(format nil "\\\ ") => "\\ "
Run Code Online (Sandbox Code Playgroud)
我认为双反斜杠会使它工作,为什么反斜杠不会逃避另一个反斜杠?
参见例如:
CL-USER> (write "\\" :escape nil)
\
"\\"
Run Code Online (Sandbox Code Playgroud)
在上面,第一个反斜杠是你的字符串,打印时没有转义反斜杠.返回的值是由REPL使用标准io语法(http://clhs.lisp.se/Body/m_w_std_.htm)打印的字符串,它会转义字符串.
因此,您的字符串包含一个反斜杠,但是以可以回读的方式打印,因此需要转义输出字符串中的反斜杠.
另请注意,format使用NIL和单个字符串调用将返回相同的字符串.
您可以检查字符串,例如通过将每个字符映射到其名称:
(loop
for input in '("\ "
"\\ "
"\\\ ")
collect (list :input input
:characters (map 'list #'char-name input)))
Run Code Online (Sandbox Code Playgroud)
这给出了:
((:INPUT " " :CHARACTERS ("Space"))
(:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space"))
(:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space")))
Run Code Online (Sandbox Code Playgroud)
或者,只需使用inspect:
CL-USER> (inspect "\\hline")
The object is a VECTOR of length 6.
0. #\\
1. #\h
2. #\l
3. #\i
4. #\n
5. #\e
Run Code Online (Sandbox Code Playgroud)
注意创建字符串和实际输出到流之间的区别:
CL-USER 69 > (format nil "\\ ")
"\\ " ; result
CL-USER 70 > (format t "\\ ")
\ ; output
NIL ; result
CL-USER 71 > (format *standard-output* "\\ ")
\ ; output
NIL ; result
Run Code Online (Sandbox Code Playgroud)