PRINT USING

いつかやろうと思っていたネタ。

http://p22.aaacafe.ne.jp/~qwerty/private/junk/printusing.d

BASICのPRINT USINGをDに移植してみました。

import printusing;

enum { LC_ALL = 0 }
extern(C) char* setlocale(int, char*);

int main()
{
	setlocale(LC_ALL, "");
	print_using(`+####`\n, 123);
	print_using(`-####`\n, 123);
	print_using(`###,###,###`\n, 123456);
	print_using(`###,###,###`\n, 123456789);
	print_using(`## + ## = ##`\n, 
		delegate void (inout using s){ s.sign_always = 0; }, 
		1, 99, 100);
	print_using(`00 + 00 = 00`\n, 
		delegate void (inout using s){ s.sign_always = 0; }, 
		1, 99, 100);
	return 0;
}
 +123
  123
    123,456
123,456,789
 1 + 99 = 100
01 + 99 = 100

書式文字列と出力の桁数が一致するため、printfなどよりも遥かに視認性がよく、かつてのBASICが唯一、現在の言語にも勝る点ではないかと…(言い過ぎ)

内部的にはtypeidを使ってあらゆる型に対応できるようにしてありますが、所詮ネタですので実装はintのみです。
どうせネタならと一瞬std.basic.printなんて名前空間を考えたりもしました。