実践CommonLispを読むその13

第十八章 FORMATの手習い

FORMATって良いよね。と言うか詳しくはわからないけど、使いやすいし理解しやすいと思う。そんなFORMATだが、LOOPと同じように嫌っている人もいるみたいですね。私にはよくわからない話ですよ。

FORMATの指示子ってのは、C言語に似ているね。と言うよりもC言語FORTRANを真似ているしLISPも指示子に関してはFORTRANをベースにしているみたいですね。だからC言語のPRINTF関数での指示子を理解していればなんとでもなりそう・・・かな。

ちなみに、FORMAT関数の「T」は「*STANDARD-OUTPUT*」の短縮形だそうです。

;;; 小数点以下2桁印字
[0]> (format t "~$" pi)
3.14
NIL
;;; 小数点以下5桁印字
[1]> (format t "~5$" pi)
3.14159
NIL
;;; 小数点以下3桁印字
[2]> (format t "~v$" 3 pi)
3.142
NIL
;;; 意味が分からない説明には、
;;;(残りのフォーマット引数の個数として評価される)らしいがわからん
[3]> (format t "~#$" pi)
3.1
NIL
;;; 小数点以下5桁印字
[4]> (format t "~,5f" pi)
3.14159
NIL

いろいろ組み合わせると魔法のように利用できるみたいだが、まだそこまで理解してないからな。

[0]> (format t "~d" 1000000)
1000000
NIL
[1]> (format t "~:d" 1000000)
1,000,000
NIL
[2]> (format t "~@d" 1000000)
+1000000
NIL
[3]> (format t "~@:d" 1000000)
+1,000,000
NIL

面白い。

あと絶対に理解しといた方がいいやつは〜

[0]> (format nil "~[cero~;uno~;dos~]" 0)
"cero"
[1]> (format nil "~[cero~;uno~;dos~]" 1)
"uno"
[2]> (format nil "~[cero~;uno~;dos~]" 2)
"dos"
[3]> (format t "~[cero~;uno~;dos~:;mucho~]" 3)
"mucho"
[4]> (format t "~[cero~;uno~;dos~:;mucho~]" 100)
"mucho"

面白いね。柔軟性があり上手く使えば芸術的なプログラムを書けそうだけど理解するのに苦労するかもしれませんね。私はまだ理解できていないもよう。

[0]> (format nil "~{~a, ~}" (list 1 2 3))
"1, 2, 3, "
[1]> (format nil "~{~a~^, ~}" (list 1 2 3))
"1, 2, 3"
[2]> (format nil "~@{~a~^, ~}" 1 2 3)
"1, 2, 3"

まあ、こんだけ理解すれば当分問題ないと思うんだが、どうだろうね。難しいところや多少複雑なところは簡単に流し読みしただけだよ。

まあいいや。