common-lisp
フォーマット
サーチ…
パラメーター
ラムダリスト | (format DESTINATION CONTROL-STRING &REST FORMAT-ARGUMENTS) |
---|---|
DESTINATION | 書くべきもの。これは、出力ストリーム、 t ( *standard-output* 省略形)、またはnil (書き込む文字列を作成する) |
CONTROL-STRING | テンプレート文字列これはプリミティブな文字列でも、追加の引数を指定して何らかの形で変換するチルドプレフィックス付きのコマンドディレクティブを含んでいてもかまいません。 |
FORMAT-ARGUMENTS | 与えられたCONTROL-STRING によって必要とされる潜在的な追加の議論。 |
備考
FORMAT
指令のCLHSのドキュメントは、 22.3節にあります。 SLIMEでは、 Cc Cd ~
Cd〜と入力すると、特定のフォーマット指示文のCLHSドキュメントを参照できます。
基本的な使い方と簡単な指示
フォーマットの最初の2つの引数は、出力ストリームと制御文字列です。基本的な使用には追加の引数は必要ありません。ストリームが*standard-output*
書き込むときにt
を渡す。
> (format t "Basic Message")
Basic Message
nil
その式はBasic Message
を標準出力に書き出し、 nil
を返します。
ストリームとしてnil
を渡すと、新しい文字列が作成され、返されます。
> (format nil "Basic Message")
"Basic Message"
ほとんどの制御文字列指令には、追加の引数が必要です。 ~a
ディレクティブ( "美的")は、 princ
プロシージャのように引数をprinc
ます。これにより、エスケープ文字なしでフォームが印刷されます(キーワードはコロンを先頭につけず、文字列には周囲の引用符が付きません)。
> (format nil "A Test: ~a" 42)
"A Test: 42"
> (format nil "Multiples: ~a ~a ~a ~a" 1 (list 2 3) "four five" :six)
"Multiples: 1 (2 3) four five SIX"
> (format nil "A Test: ~a" :test)
"A Test: TEST"
> (format nil "A Test: ~a" "Example")
"A Test: Example"
~a
追加の入力に基づいて~a
オプションで右または左のパッド入力。
> (format nil "A Test: ~10a" "Example")
"A Test: Example "
> (format nil "A Test: ~10@a" "Example")
"A Test: Example"
~s
指示は~a
と似ていますが、エスケープ文字を出力します。
> (format nil "A Test: ~s" 42)
"A Test: 42"
> (format nil "Multiples: ~s ~s ~s ~s" 1 (list 2 3) "four five" :six)
"Multiples: 1 (2 3) \"four five\" :SIX"
> (format nil "A Test: ~s" :test)
"A Test: :TEST"
> (format nil "A Test: ~s" "Example")
"A Test: \"Example\""
リストを反復する
~{
と~}
ディレクティブを使用してリストを反復処理できます。
CL-USER> (format t "~{~a, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5,
要素が残っていなければ~^
を使用してエスケープすることができます。
CL-USER> (format t "~{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5
数値引数を~{
に渡すと、反復の回数を制限することができます。
CL-USER> (format t "~3{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3,
~@{
リストの代わりに残りの引数を繰り返します:
CL-USER> (format t "~a: ~@{~a~^, ~}~%" :foo 1 2 3 4 5)
FOO: 1, 2, 3, 4, 5
サブリストは、 ~:{
:を使用して反復することができます。
CL-USER> (format t "~:{(~a, ~a) ~}~%" '((1 2) (3 4) (5 6)))
(1, 2) (3, 4) (5, 6)
条件式
条件式は~[
と~]
で行うことができます。式の句は、 ~;
を使用して区切られ~;
。
デフォルトで~[
は引数リストから整数をとり、対応する節を選びます。節はゼロから始まります。
(format t "~@{~[First clause~;Second clause~;Third clause~;Fourth clause~]~%~}"
0 1 2 3)
; First clause
; Second clause
; Third clause
; Fourth clause
最後の句は~:;
で区切ることができます~:;
代わりにそれをelse節にします。
(format t "~@{~[First clause~;Second clause~;Third clause~:;Too high!~]~%~}"
0 1 2 3 4 5)
; First clause
; Second clause
; Third clause
; Too high!
; Too high!
; Too high!
条件式が~:[
、で始まる場合は、整数の代わりに一般化されたブール値が必要です。それには2つの節しかありません。ブール値がNIL
場合は最初のものが表示され、真実の場合は2番目の句が表示されます。
(format t "~@{~:[False!~;True!~]~%~}"
t nil 10 "Foo" '())
; True!
; False!
; True!
; True!
; False!
条件式が~@[
で始まる場合は、入力が一般化されたブール値であれば真である句が1つだけ存在するはずです。ブール値は真実であれば消費されません。
(format t "~@{~@[~s is truthy!~%~]~}"
t nil 10 "Foo" '())
; T is truthy!
; 10 is truthy!
; "Foo" is truthy!