基本上,我想执行以下操作,仅使用 Common Lisp 而不是 Python:
print("Hello world.\r\n")
我可以做到这一点,但它只输出
#\newline
字符并跳过 #\return
:
(format t "Hello world.~%")
我相信我可以使用外部论证来完成此任务,如下所示:
(format t "Hello world.~C~%" #\return)
但这对我来说似乎很尴尬。当然,我可以以某种方式将
#\return
嵌入到格式字符串中,就像我可以 #\newline
?
用于回车和换行的字符
\r
是 Common Lisp 中的字符 #\return
。
\n
是 Common Lisp 中的字符 #\linefeed
。
以下内容以回车和换行结束字符串
"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 机器使用 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
首先,在 Common Lisp 中,大多数字符,包括 return/newline,都可以直接插入到字符串中。唯一需要转义的字符是字符串分隔符。
还有一个库 cl-interpol,它提供了一个读取宏来构造具有更复杂语法的字符串,包括特殊字符转义。
如果有人只想要一个以 CRLF 结尾的字符串,我认为这是一个很好的方法:
(concatenate 'string "hello" '(#\return #\linefeed))
您可以在 REPL 中检查它是否产生了预期的输出:
CL-USER> (map 'list #'char-code (concatenate 'string "hello" '(#\return #\linefeed)))
(104 101 108 108 111 13 10)