web-dev-qa-db-fra.com

L'équivalent commun de LIS de \ r dans la fonction de formatage?

Fondamentalement, j'aimerais faire ce qui suit, en utilisant uniquement Common LISP au lieu de Python:

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

Je peux le faire, mais il ne sort que le #\newline caractère et saute #\return:

(format t "Hello world.~%")

Je crois que je pourrais accomplir cela en utilisant un argument extérieur, comme ceci:

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

Mais cela me semble gênant. Je peux sûrement en quelque sorte intégrer #\return dans la chaîne même de format, comme je peux #\newline?

41
user12163

Caractères pour le retour et le saut de ligne

\r est le caractère #\return dans LISP commun.

\n est le caractère #\linefeed dans LISP commun.

Ce qui suit termine la chaîne "Hello world." avec retour et saut de ligne.

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

#\newline est tout ce que la plate-forme utilise comme division de ligne. Sur les machines Unix, c'est souvent la même chose que #\linefeed. Sur d'autres plateformes (Windows, LISP Machines, ...) cela pourrait être différent.

contrôle FORMAT

Le contrôle FORMAT~% imprime une nouvelle ligne (!).

Alors

(format t "Hello world.~%")

imprimera la nouvelle ligne utilisée par le système d'exploitation. CR ou CRLF ou LF. Selon la plateforme, ce sera un ou deux caractères.

Ainsi, sur une machine Windows, votre

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

pourrait en fait imprimer: #\return#\return#\linefeed. Ce qui fait TROIS caractères et non deux. Windows utilise CRLF pour les retours à la ligne. Unix utilise LF. Les anciens Mac OS (avant Mac OS X) et les machines LISP utilisaient CR pour les nouvelles lignes.

Écriture CRLF

Si vous voulez vraiment imprimer CRLF, vous devez le faire explicitement. Par exemple avec:

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

FORMAT n'a pas de syntaxe spéciale pour la sortie des sauts de ligne ou des caractères de retour chariot.

sauts de ligne dans le contrôle FORMAT

LISP commun autorise les chaînes multi-lignes. Ainsi, nous pouvons les utiliser comme contrôles de format:

Ici, vous pouvez voir que le saut de ligne dans la chaîne de contrôle se trouve également dans la sortie:

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

first line
second line

NIL

Voici un exemple où le ~@ Le contrôle FORMAT conserve le saut de ligne, mais supprime les espaces sur la ligne suivante:

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

first line
second line

NIL
60
Rainer Joswig

Premièrement, dans Common LISP, la plupart des caractères, y compris return/newline, peuvent être insérés directement dans la chaîne. Le seul caractère à échapper est le délimiteur de chaîne.

Il existe également une bibliothèque cl-interpol qui fournit une macro de lecture pour construire des chaînes avec une syntaxe plus complexe, y compris des caractères d'échappement spéciaux.

5
Ramarren