2010-04-11 13 views
36

Zasadniczo chciałbym zrobić, co następuje tylko przy użyciu Common Lisp zamiast Python:Zwykły odpowiednik Lisp r wewnątrz funkcji formatu?

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

mogę to zrobić, ale tylko wyprowadza charakter #\newline i pomija #\return:

(format t "Hello world.~%") 

wierzę mogłem tego dokonać za pomocą zewnętrznego argumentu, tak:

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

Ale to wydaje się niewygodne do mnie. Z pewnością mogę w jakiś sposób wstawić #\return do łańcucha formatu, tak jak mogę #\newline?

Odpowiedz

49

Postacie na powrocie zaś Linefeed

\r jest charakter #\return w Common Lisp.

\n jest postacią #\linefeed w Common Lisp.

Poniżej kończy się ciąg "Hello world." z funkcją powrotu i podawania linii.

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

#\newline jest cokolwiek platforma wykorzystuje jako linii podziału. Na komputerach z systemem Unix często jest taki sam jak #\linefeed. Na innych platformach (Windows, Lisp Machines, ...) może być inaczej.

kontrola FORMAT

kontrolą FORMAT~% drukuje nową linią (!).

Więc

(format t "Hello world.~%") 

wydrukuje przełamane, że system operacyjny używa. CR lub CRLF lub LF. W zależności od platformy będzie to jeden lub dwa znaki.

Tak, na komputerze z systemem Windows swoje

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

może faktycznie druku: #\return#\return#\linefeed. Który ma TRZY postacie, a nie dwa. System Windows używa CRLF do nowych linii. Unix używa LF. Stary Mac OS (wcześniej Mac OS X) i Lisp Machines używały CR dla nowych linii.

Pisanie CRLF

Jeśli naprawdę chcesz wydrukować CRLF, trzeba to zrobić w sposób jawny.Na przykład:

(defun crlf (&optional (stream *standard-output*)) 
    (write-char #\return stream) 
    (write-char #\linefeed stream) 
    (values)) 

FORMAT nie posiada specjalną składnię wyjściu Linefeed lub powrót karetki znaków.

linebreaks w kontroli formatu

Common Lisp pozwala ciągi kilka linii. W ten sposób możemy wykorzystać je jako kontrole format:

Tutaj można zobaczyć, że podział wiersza w ciągu sterowania jest również na wyjściu:

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

first line 
second line 

NIL 

Oto przykład, gdy kontrola [email protected] FORMAT utrzymuje linebreak , ale usuwa spacje w następnym wierszu:

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

first line 
second line 

NIL 
+1

W SBCL 1.0.22, clisp 2,47 i Clozure CL 1.3 w systemie Windows: (AREF (format nil "~") 0%) zwraca # \ linią. –

+0

@Frank Shearar: i co robi (długość (format zerowy "~%")) produkować? A co wytwarza podczas pisania do pliku? Jak długi jest plik? –

+1

1, 1 i 1 dla długości. With (with-open-file (s #p "c: \\ foo.txt": direction: output: if-exists: supersede) (ciąg-zapisu (format zero "~%") s)), SBCL i CCL wyrzucił 1-bajtowy plik zawierający \ #Newline. Clisp wypluł 1-bajtowy plik zawierający # \ Return! –

5

Po pierwsze, w Common Lisp większość znaków, w tym return/newline, można wstawiać bezpośrednio do ciągu znaków. Jedyną postacią wymagającą ucieczki jest ogranicznik łańcucha.

Istnieje również biblioteka cl-interpol, która zapewnia makro odczytu do konstruowania ciągów o bardziej złożonej składni, w tym specjalnych znaków ucieczki.