2010/11/07
それLispでも(ry
空白以外のキャラクターで桁あわせさせる指定があるのってCOBOLだっけ?
131 デフォルトの名無しさん [sage] 2010/11/07(日) 10:37:16 ID: Be: 数字を、 **100 *1000 みたいに、桁数固定でゼロサプレスするけど代わりに*を埋める、みたいなことを printfでできますか
無駄に高機能なCLのformatの出番ですよ。nilはformatの返り値。
cl-user> (format t "~5,'*d" 1000) *1000 nil cl-user> (format t "~5,'*d" 100) **100 nil
この機能はGaucheのformatにも入ってる。#<undef>はformatの返り値。
gosh> (format #t "~5,'*d" 100) **100#<undef> gosh> (format #t "~5,'*d" 1) ****1#<undef>
(Common Lispでformatの出力の後に改行されてるのは、formatが 改行してるんじゃなくて、REPLが改行を入れてる。)
正直、formatの仕様は詰め込みすぎだし、拡張性にも難があるし、 好きではないのだけれど、かといってすっきりした代替案 (例えばコンビネータでフォーマッティングをcomposableにするやつを 誰か書いてたな。Alex Shinnだったっけな。) もあんまり流行らない。
formatにせよprintfにせよ、単純なケースから程々に複雑なケースまで 日常出会う95%くらいの用途についてはコンパクトで便利なんだよね。 残り5%で困ることがあって(例えばちょっとだけ振る舞いをデフォルトから 変えたい、とか)、それを綺麗にカバーするシステムを書いたとしても、 95%のより単純なケースで既存のシステムより便利でないと 使ってもらえない。
まあ、formatに限らずそういうことはよくある。
Tags: Programming, Lisp, Gauche
Post a comment