Подтвердить что ты не робот

Общий Lisp эквивалент \r внутри функции формата?

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

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

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

(format t "Hello world.~%")

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

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

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

4b9b3361

Ответ 1

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

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

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

Далее строка "Hello world." завершается возвратом и переводом строки.

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

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

Контроль FORMAT

Элемент 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

Общий Lisp позволяет многострочные строки. Таким образом, мы можем использовать их в качестве элементов управления форматом:

Здесь вы можете видеть, что разрыв строки в строке управления также находится в выводе:

CL-USER 77 > (format t "~%first line
second line~%~%")

first line
second line

NIL

Вот пример, в котором элемент управления [email protected] FORMAT сохраняет строку, но удаляет пробелы на следующей строке:

CL-USER 78 > (format t "~%first [email protected]
                          second line~%~%")

first line
second line

NIL

Ответ 2

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

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