str
内部のフォーマット文字列~{str~}
は、反復ごとにリストから複数の引数を使用できます。これは、引数のリストが 3 で割り切れる保証がある場合、 のような書式文字列を使用できることを意味します~{~a ~a ~a~%~}
。次に例を示します。
CL-USER> (format nil "~{~a ~a ~a~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6
"
ただし、3 で割り切れない引数が多数ある場合は、反復を早期に終了する必要があります。~^
引数がなくなった場合は、 format ディレクティブを使用して中断できます。1 番目または 2 番目の引数の後にこの状況になる可能性があるため、それらの場所の後にこれらのいずれかを追加する必要があります。末尾の引数が 0、1、2 の場合の例を次に示します。
CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4))
"1 2 3
4"
CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4 5))
"1 2 3
4 5"
CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6
"
要素の数が 3 で割り切れる場合は、最後の改行が必要ない場合があります。この場合~^
、改行の前にa を追加することもできます。
CL-USER> (format nil "~{~a~^ ~a~^ ~a~^~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6"
この種の構文は、区切られたリストを書くのに特に適しています:
CL-USER> (format nil "write(~{~a~^,~})" '("fd" "buf" "count"))
"write(fd,buf,count)"
これらのフォーマット ディレクティブ (およびそのバリアント) は、HyperSpec でより詳細に説明されています (リンクされたページには、ここで引用されているものよりも多くの情報があります)。
~{str~}
これは反復構造です。引数はlistである必要があります。これは、 formatへの再帰呼び出しの場合と同様に、一連の引数として使用されます。文字列 strは、制御文字列として繰り返し使用されます。各反復は、引数として好きなだけリストの要素を吸収できます。strがそれ自体で 2 つの引数を使い果たす場合、ループのたびにリストの 2 つの要素が使い果たされます。反復ステップの前にリストが空の場合、反復は終了します。また、接頭辞パラメータnが指定されている場合、最大でn回のstr
の処理の繰り返しがあります。. 最後に、~^
ディレクティブを使用して、反復を途中で終了させることができます。
これらの質問にも興味があるかもしれません: