2010-04-11 2 views
36

В принципе, я хотел бы сделать следующее, только с помощью Common Lisp вместо Python:Общий эквивалент Лиспа r внутри функции формата?

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

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

(format t "Hello world.~%") 

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

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

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

ответ

49

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

\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 управления

The FORMAT Control ~% печатает символ новой строки (!).

Так

(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 не имеет специальный синтаксис для вывода Linefeed или символов возврата каретки.

переносы в управлении FORMAT

Common 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 
+1

В SBCL 1.0.22, CLISP 2,47 и Clozure CL 1.3 на Windows: (Ареф (формат ноль "~%") 0) возвращает # \ Newline. –

+0

@Frank Shearar: а что (длина (формат nil "~%")) производит? И что он производит, когда вы пишете его в файл? Как долго файл? –

+1

1, 1 и 1 для длины. С (с открытым файлом (s #p "c: \\ foo.txt": direction: output: if-exists: supersede) (строка записи (формат nil "~%") s)), SBCL и CCL выплюнул 1-байтовый файл, содержащий \ #Newline. Clisp выплюнул 1-байтовый файл, содержащий # \ Return! –

5

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

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