Shammer's Philosophy

My private adversaria

文字の整形に format を使用する

Lisp を触り出した頃から format を使用して動作を確認してきた。デバッグプリントのたびに format を使用してきた。いわば、C 言語で言うところの printf 的な存在。単に文字列を標準出力に出すのみでなく、その見せ方を制御できるのが printf のいいところだった。つまり、"Hello, $Name!" みたいな形で Name については呼出の都度変えたいという場合、

printf("Hello, %s!", name)

というようにしていた。これを単純に文字列を連結させるとなると、"Hello, " + name みたいにしないといけない。これだけならまだいいが、可変にしたいところが増えると、+ が増えていって一気に読みにくくなるし、もしかしたら不具合が入り込むかも。。。まあ、不具合と言ってもここから想定される問題は表示上の問題かもしれないが、、、ただ、不具合の実害の大きさ以前に、そもそもコードを読みにくくなるという問題も出てくるだろう。

ちなみに、Lisp で "Hello, " + name をしようとすれば、

(concatenate 'string "Hello, " name)

というようになる。Lisp の場合は + がない分、C ほど可読性は落ちないだろうが、それでもハードコーディングされた文字と変数がずらずらと並ぶことで読みにくくなってしまうと不具合のトリガーになりかねないだろう。こうならないように、なんとか format のように書けないだろうかと思っていたら・・・そのまま format を使用できることがわかった。(format t "hogehoge") と、第一引数に t を指定しているが、この t が標準出力に連結した文字を出力するという動作で、この第一引数を nil にすることで標準出力に出力されるべき文字を文字列として返すことができるようだ。concatenate 'string で、ズラズラと文字を連結するような場合は、この format nil を使用して回避できるようにしようと思った。