如何在通用Lisp中格式化单个反斜杠?

时间:2018-10-12 15:38:28

标签: lisp common-lisp gnu-common-lisp

我目前正在尝试在GNU Common lisp 2.49中获取... \hline的输出,但是我无法使用该格式。到目前为止,这是我尝试过的一个反斜杠:

(format nil "\ ") => " "
(format nil "\\ ") => "\\ "
(format nil "\\\ ") => "\\ "

我认为双反斜杠将使其起作用,为什么反斜杠不只转义另一个反斜杠?

2 个答案:

答案 0 :(得分:7)

例如参见

CL-USER> (write "\\" :escape nil)
\
"\\"

在上面,第一个反斜杠是您的字符串,打印时不会转义反斜杠。返回的值是由REPL使用标准io语法(http://clhs.lisp.se/Body/m_w_std_.htm)打印的字符串,该字符串会转义字符串。

因此,您的字符串只包含一个反斜杠,但其打印方式可以使其被读回,因此需要在输出字符串中转义反斜杠。

还请注意,使用NIL和单个字符串调用format会返回相同的字符串。

例如,可以通过将每个字符映射到其名称来检查字符串:

(loop
   for input in '("\ " 
                  "\\ "
                  "\\\ ")
   collect (list :input input
                 :characters (map 'list #'char-name input)))

这给出了:

((:INPUT " " :CHARACTERS ("Space"))
 (:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space"))
 (:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space")))

或者,只需使用inspect

CL-USER> (inspect "\\hline")

The object is a VECTOR of length 6.
0. #\\
1. #\h
2. #\l
3. #\i
4. #\n
5. #\e

答案 1 :(得分:6)

请注意创建字符串和实际将输出输出到流之间的区别:

CL-USER 69 > (format nil "\\ ")
"\\ "                               ; result

CL-USER 70 > (format t "\\ ")
\                                   ; output
NIL                                 ; result

CL-USER 71 > (format *standard-output* "\\ ")
\                                   ; output
NIL                                 ; result