基本上,我想做以下事情,只使用Common Lisp而不是Python:
print("Hello world.\r\n")
我可以这样做,但它只输出#\newline
字符并跳过#\return
:
(format t "Hello world.~%")
我相信我可以使用外部参数完成此操作,如下所示:
(format t "Hello world.~C~%" #\return)
但对我来说似乎很尴尬。当然,我可以以某种方式将#\return
嵌入到格式字符串中,就像我可以#\newline
一样?
答案 0 :(得分:57)
返回和换行的字符
\r
是Common Lisp中的字符#\return
。
\n
是Common Lisp中的字符#\linefeed
。
以下结束带有return和换行符的字符串"Hello world."
。
(format t "Hello world.~C~C" #\return #\linefeed)
#\newline
是平台用作线路划分的任何内容。在Unix机器上,这通常与#\linefeed
相同。在其他平台上(Windows,Lisp Machines,...),这可能会有所不同。
格式控制
FORMAT
控件~%
打印换行符(!)。
所以
(format t "Hello world.~%")
将打印操作系统使用的换行符。 CR或CRLF或LF。根据平台,这将是一个或两个字符。
所以,在Windows机器上你的
(format t "Hello world.~C~%" #\return)
实际上可能会打印:#\return
#\return
#\linefeed
。这是三个字,而不是两个。 Windows将CRLF用于换行。 Unix使用LF。旧Mac OS(Mac OS X之前)和Lisp Machines将CR用于换行。
撰写CRLF
如果您真的想要打印CRLF,则必须明确地执行此操作。例如:
(defun crlf (&optional (stream *standard-output*))
(write-char #\return stream)
(write-char #\linefeed stream)
(values))
FORMAT
没有输出换行符或回车符的特殊语法。
FORMAT控件中的换行符
Common Lisp允许多行字符串。因此,我们可以将它们用作格式控件:
在这里你可以看到控制字符串中的换行符也在输出中:
CL-USER 77 > (format t "~%first line
second line~%~%")
first line
second line
NIL
以下是~@
FORMAT控件保留换行符的示例,但删除了下一行的空格:
CL-USER 78 > (format t "~%first line~@
second line~%~%")
first line
second line
NIL
答案 1 :(得分:5)
首先,在Common Lisp中,大多数字符,包括return / newline,都可以直接插入到字符串中。唯一需要转义的字符是字符串分隔符。
还有一个库cl-interpol,它提供了一个读取宏来构造具有更复杂语法的字符串,包括特殊字符转义。