5

~%リストの 3 番目の引数ごとに(を使用して) キャリッジ リターンを追加するにはどうすればよいですか?
たとえば、私は今持っています:

(format nil "~{~a ~}" (list '"one" '"two" '"three" '"four" '"five" '"six" '"seven" '"eight" '"nine" '"ten"))  
;=> "one two three four five six seven eight nine ten " 

しかし、私はしたいです:

;=> "one two three  
; four five six  
; seven eight nine  
; ten "  
4

1 に答える 1

17

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 でより詳細に説明されています (リンクされたページには、ここで引用されているものよりも多くの情報があります)。

22.3.7.4 チルダ左中括弧: 反復

~{str~}

これは反復構造です。引数はlistである必要があります。これは、 formatへの再帰呼び出しの場合と同様に、一連の引数として使用されます。文字列 strは、制御文字列として繰り返し使用されます。各反復は、引数として好きなだけリストの要素を吸収できます。strがそれ自体で 2 つの引数を使い果たす場合、ループのたびにリストの 2 つの要素が使い果たされます。反復ステップの前にリストが空の場合、反復は終了します。また、接頭辞パラメータnが指定されている場合、最大でn回のstr の処理の繰り返しがあります。. 最後に、~^ディレクティブを使用して、反復を途中で終了させることができます。

これらの質問にも興味があるかもしれません:

于 2013-10-22T15:51:35.990 に答える