Common Lisp的格式函数中\ r的等价物?

基本上,我想要做以下事情,只使用Common Lisp而不是Python:

print("Hello world.\r\n") 

我可以这样做,但它只输出#\newline并跳过#\return

 (format t "Hello world.~%") 

我相信我可以用外部的论据来完成这个工作,例如:

 (format t "Hello world.~C~%" #\return) 

但对我来说似乎很尴尬。 当然,我可以以某种方式embedded#\return到格式string,就像我可以#\newline

返回和换行的字符

\r是Common Lisp中的字符#\return

\n是Common Lisp中的字符#\linefeed

以下结束string"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允许多行string。 因此我们可以使用它们作为格式控件:

在这里您可以看到控制string中的换行符也在输出中:

 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 

首先,在Common Lisp中,大部分字符(包括return / newline)可以直接插入到string中。 唯一需要转义的字符是string分隔符。

还有一个库cl-interpol ,它提供了一个读macros来构造更复杂语法的string,包括特殊字符转义。