web-dev-qa-db-ja.com

format関数内の共通のLISPの\ rと同等のもの?

基本的に、Pythonの代わりにCommon LISPのみを使用して、以下を実行します。

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

これは可能ですが、#\newline文字のみを出力し、#\returnをスキップします。

(format t "Hello world.~%")

私は次のような外部の議論を使用してこれを達成できると信じています:

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

しかし、私には不便に思われます。確かに、#\return#\newlineのように、まさにその形式の文字列に埋め込むことができます。

41
user12163

改行と改行の文字

\rはCommon LISPの文字#\returnです。

\nはCommon LISPの文字#\linefeedです。

以下は、文字列"Hello world."を改行と改行で終了します。

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

#\newlineは、プラットフォームがライン分割として使用するものです。 Unixマシンでは、これはしばしば#\linefeedと同じです。他のプラットフォーム(Windows、LISPマシンなど)では、これは異なる場合があります。

FORMATコントロール

FORMATコントロール~%は改行(!)を出力します。

そう

(format t "Hello world.~%")

オペレーティングシステムが使用する改行を出力します。 CRまたはCRLFまたはLF。プラットフォームに応じて、これは1文字または2文字になります。

したがって、Windowsマシンでは

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

実際に印刷される可能性があります:#\return#\return#\linefeed。 2文字ではなく3文字です。 WindowsはCRLFを改行に使用します。 UnixはLFを使用します。古いMac OS(Mac OS Xより前)およびLISPマシンでは、改行にCRを使用していました。

CRLFを書き込む

本当にCRLFを印刷したい場合は、明示的に行う必要があります。たとえば:

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

FORMATには、改行または復帰文字の出力のための特別な構文はありません。

FORMATコントロールの改行

一般的なLISPでは、複数行の文字列を使用できます。したがって、これらをフォーマットコントロールとして使用できます。

ここでは、制御文字列の改行が出力にも含まれていることがわかります。

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

first line
second line

NIL

以下は、~@ FORMATコントロールが改行を保持するが、次の行の空白を削除する例です。

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

first line
second line

NIL
60
Rainer Joswig

まず、Common LISPでは、リターン/改行を含むほとんどの文字を文字列に直接挿入できます。エスケープが必要な唯一の文字は文字列区切り文字です。

ライブラリ cl-interpol もあり、特殊文字のエスケープを含む、より複雑な構文で文字列を構築するための読み取りマクロを提供します。

5
Ramarren