Common Lisp相当于格式函数里面的\ r \ n?

时间:2010-04-11 23:46:30

标签: format newline common-lisp

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

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

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

(format t "Hello world.~%")

我相信我可以使用外部参数完成此操作,如下所示:

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

但对我来说似乎很尴尬。当然,我可以以某种方式将#\return嵌入到格式字符串中,就像我可以#\newline一样?

2 个答案:

答案 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,它提供了一个读取宏来构造具有更复杂语法的字符串,包括特殊字符转义。