L'équivalent de R de Common Lisp dans la fonction de format?

Fondamentalement, je voudrais faire ce qui suit, en utilisant seulement Common Lisp au lieu de Python:

print("Hello world.rn")

Je peux le faire, mais il ne renvoie la #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 ça me semble maladroit. Je peux sûrement intégrer #return dans la chaîne de format même, comme je peux #newline?

38
demandé sur nbro 2010-04-12 03:46:30

2 réponses

Les Caractères de retour et de retour à la ligne

\r c'est le caractère #\return en Common Lisp.

\n c'est le caractère #\linefeed en Common Lisp.

Ce qui suit termine la chaîne "Hello world." avec return et linefeed.

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

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

FORMAT contrôle de la

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

Donc

(format t "Hello world.~%")

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

Donc, sur une machine Windows votre

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

Pourrait en fait impression: #\return #\return #\linefeed. Ce qui est trois caractères et non deux. Windows utilise CRLF pour les retours à la ligne. Unix utilise LF. Ancien Mac OS (avant Mac OS X) et Lisp machines utilisé CR pour les retours à la ligne.

Écrire 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 caractères de retour de ligne ou de retour chariot.

Sauts de ligne dans le contrôle de FORMAT

Common Lisp permet des 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 est également dans le sortie:

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

first line
second line

NIL

Voici un exemple où le contrôle de 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
53
répondu Rainer Joswig 2017-02-09 23:07:17

Tout d'abord, 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 nécessitant un échappement 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 échappements de caractères spéciaux.

5
répondu Ramarren 2010-04-14 20:24:23