Общий лисповский эквивалент \ r внутри функции форматирования? - PullRequest
39 голосов
/ 12 апреля 2010

По сути, я бы хотел сделать следующее, используя Common Lisp вместо Python:

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

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

(format t "Hello world.~%")

Полагаю, я мог бы добиться этого, используя внешний аргумент, например:

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

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

Ответы [ 2 ]

57 голосов
/ 15 апреля 2010

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

\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 ~% печатает новую строку (!).

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
5 голосов
/ 15 апреля 2010

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

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

...