Эквивалент языка Common LISP \r в функции формата?

В основном я хотел бы сделать следующий, только использующий язык Common LISP вместо Python:

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

Я могу сделать это, но это только производит #\newline символ и пропуски #\return:

(format t "Hello world.~%")

Я полагаю, что мог выполнить это использование внешнего аргумента, как это:

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

Но, кажется неловким мне. Конечно, я могу так или иначе встроить #\return в очень строку формата как я могу #\newline?

40
задан nbro 7 September 2017 в 23:07
поделиться

2 ответа

Символы для возврата и перевода строки

\r - это символ #\return в Common Lisp.

\n - это символ #\linefeed в Common Lisp.

Ниже приведено завершение строки "Hello world." с возвратом и переводом строки.

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

#\newline - это то, что платформа использует в качестве разделения строки. На машинах Unix это часто то же самое, что #\linefeed. На других платформах (Windows, Lisp Machines, ...) это может быть по-другому.

Элемент управления FORMAT

Элемент управления FORMAT ~% печатает новую строку (!).

So

(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
58
ответ дан 27 November 2019 в 01:43
поделиться

Во-первых, в Common Lisp большинство символов, включая return/newline, могут быть вставлены непосредственно в строку. Единственный символ, требующий экранирования, - это разделитель строк.

Существует также библиотека cl-interpol, которая предоставляет макрос чтения для построения строк с более сложным синтаксисом, включая экранирование специальных символов.

5
ответ дан 27 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: