2010-04-11 4 views
36

Fondamentalmente, mi piacerebbe fare quanto segue, utilizzando solo Common Lisp, invece di Python:L'equivalente di Common Lisp di r all'interno della funzione di formattazione?

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

posso fare questo, ma emette solo il carattere #\newline e salta #\return:

(format t "Hello world.~%") 

credo che potrei fare questo si utilizza un argomento al di fuori, come questo:

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

Ma è sembra imbarazzante per me. Sicuramente posso in qualche modo incorporare #\return nella stringa di formato molto, come posso #\newline?

risposta

49

caratteri per ritorno e avanzamento riga

\r è il personaggio #\return in Common Lisp.

\n è il carattere #\linefeed in Common Lisp.

Quanto segue termina la stringa "Hello world." con ritorno e avanzamento riga.

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

#\newline è qualunque sia la piattaforma utilizzata come una divisione di linea. Su macchine Unix questo è spesso lo stesso di #\linefeed. Su altre piattaforme (Windows, Lisp Machines, ...) questo potrebbe essere diverso.

controllo del formato

Il controllo FORMAT~% stampe un ritorno a capo (!).

Così

(format t "Hello world.~%") 

stamperà il ritorno a capo che utilizza il sistema operativo. CR o CRLF o LF. A seconda della piattaforma questo sarà uno o due caratteri.

Quindi, su una macchina Windows tua

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

potrebbe effettivamente stampa: #\return#\return#\linefeed. Che è di TRE caratteri e non due. Windows utilizza CRLF per i newline. Unix usa LF. Il vecchio Mac OS (precedente a Mac OS X) e le macchine Lisp utilizzavano CR per i newline.

scrittura CRLF

Se davvero si vuole stampare CRLF, è necessario farlo in modo esplicito.Ad esempio con:

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

FORMAT non ha sintassi speciale per l'uscita di caratteri di avanzamento riga o ritorno a capo.

Linebreaks in controllo del formato

Common Lisp permette stringhe multilinea. Così li possiamo usare come controlli di formato:

Qui si può vedere che l'interruzione di riga nella stringa di controllo è inoltre in uscita:

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

first line 
second line 

NIL 

Ecco un esempio in cui il controllo [email protected] FORMAT mantiene il linebreak , ma rimuove gli spazi vuoti nella riga successiva:

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

first line 
second line 

NIL 
+1

In SBCL 1.0.22, CLISP 2,47 e Clozure CL 1.3 su Windows: (Aref (formato zero "~%") 0) restituisce # \ Newline. –

+0

@Frank Shearar: e cosa produce (lunghezza (formato nil "~%"))? E cosa produce quando lo scrivi in ​​un file? Quanto è lungo il file? –

+1

1, 1 e 1 per la lunghezza. Con (con-file-aperto (s #p "c: \\ foo.txt": direction: output: if-exists: supersede) (write-string (formato nil "~%") s)), SBCL e CCL sputa un file di 1 byte contenente \ #Newline. Clisp sputò un file di 1 byte contenente un # \ Return! –

5

Innanzitutto, in Common Lisp la maggior parte dei caratteri, incluso return/newline, può essere inserita direttamente nella stringa. L'unico carattere che richiede l'escape è il delimitatore di stringhe.

C'è anche una libreria cl-interpol che fornisce una macro di lettura per costruire stringhe con sintassi più complessa, compresi i caratteri speciali di escape.