Island Life

< | 虹 (解答編) >

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

Name: