Common Lisp 相当于 在格式化函数中?

问题描述 投票:0回答:3

基本上,我想执行以下操作,仅使用 Common Lisp 而不是 Python:

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

我可以做到这一点,但它只输出

#\newline
字符并跳过
#\return
:

(format t "Hello world.~%")

我相信我可以使用外部论证来完成此任务,如下所示:

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

但这对我来说似乎很尴尬。当然,我可以以某种方式将

#\return
嵌入到格式字符串中,就像我可以
#\newline

format newline common-lisp
3个回答
73
投票

用于回车和换行的字符

\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

6
投票

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

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


0
投票

如果有人只想要一个以 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)
© www.soinside.com 2019 - 2024. All rights reserved.