* D言語のUFCSを真似したい#1
-(by [[K]], 2022.05.05)
** (1)
-UFCSというのは Uniform Function Call Syntax の略で、メンバ関数ではない関数でも、メンバ関数であるかのように呼び出せる文法のことです。
--ここに詳しい説明があります。
--https://tour.dlang.org/tour/ja/gems/uniform-function-call-syntax-ufcs
-D言語では引数のない関数呼び出しの場合に()を省略できるという仕様があると書かれていますが、今回はそこは真似しません。それはできなくてもいいかなと今は思うからです。
-そもそもC言語にはメンバ関数がありません。だからC言語にUFCSがあればメンバ関数っぽいことができるというわけです。
** (2)
-UFCSができるようになったら、例えばこんなことができるはずです・・・。
// UFCSを使わない書き方
FILE *fp = fopen("abc.txt", "wt");
fprintf(fp, "hello!\n");
fclose(fp);
// UFCSを使ってこうしてみたい・・・
fopen("abc.txt", "wt").fprintf("hello!\n").fclose();
-これは、いい!と私は思うのです。
-一行で書けるところももちろんいいですが、fpの宣言がいらないところもいいです。簡単なことのために変数を宣言しなくていいわけです。
~
-ちなみに私は、このUFCSを見た時に Objective-C を思い出しました。
NSString* string = [[[NSString alloc] init] autorelease];
-こう、左から右につないでいけるって、本当にいいなって思います。
-これができなかったら、
fclose(fprintf(fopen("abc.txt", "wt"), "hello!\n"));
-ってなるんですよ。これはとても読みにくいです!
** (3)
-UFCSができるようになったら、関数の返値について、いろいろ考えることが増えそうです。
-たとえばfread()はfpを返すべきでしょうか。それともbufを返すべきでしょうか。
-もしfpを返すなら、UFCSによってファイル関係の操作を連続させることができます。でもbufを返すなら、ファイルから読み込んだ内容に対する処理を書くことができそうです。
-うーん、この場合はbufを返すほうが便利そうな感じがします。
-とりあえず、voidを返す関数は書かない気がします。連鎖しないので。
-(編集中)