🚰

プログラミングにおける結果目的語(のようなもの)

に公開1

κeenです。突然ですが、みなさんは「お湯を沸かす」「穴を掘る」「ご飯を炊く」といった表現をどう感じますか?自然な日本語に感じますが、よく考えると変なところがあります。お湯は沸かした結果得られるものなので「水を沸かす(してお湯にする)」が正しそうな気がします。その他もそれぞれ「地面を掘る(って穴を作る)」「米を炊く(いてご飯にする)」となるはずです。こういう何か操作をした結果得られるものを目的語にしたものを 結果目的語 と呼ぶようです。よく考えると変というだけで別に間違った日本語という訳ではないです。ただ面白い現象だよねってだけです。

そういうのを踏まえた上でいくかの疑似コード片をみて下さい。

var sorted_array = getRandomArray();
sorted_array.sort();
var index = Arrays.binarySearch(sorted_array, 10);
int sum = 0;
for(int i = 0; i < 10; i++) {
    sum += i;
}
let result = "";
if (a == 1)
  result += "a = 1;";
if (b == 2)
  result += "b = 2;";
if (c == 3)
  result += "c = 3;";
return result;

それぞれのコード片の最初に変数を作っていますが、変数を初期化した時点では名前と中身がくい違っています。ですがコードの末尾では名前のとおりのものが収まっていますね。

この変数たち、最初に話題に出した結果目的語と似ていませんか?どちらも出来上がったものの名前を使っています。プログラミング言語に目的語なんてものはないので変数の方は 結果変数 とでも呼びましょうか。

結果変数を使うパターンは上に挙げたようにいかにも初期値のようなものを使うケースもあれば、一見してどのタイミングで完成しているのか分かりづらいものもあります。

# 一見これで送るようにみえる
send_users = Users.get_followed_users()
# しかしこのあと加工が入る
Users.get_block_list().remove_blocked_users(send_users)

こういうパターンに遭遇すると一瞬「おや?」と思いますよね。なんとなくプログラミングパターンにそのまま使う変数と結果変数を分ける文法があれば便利なのかなと思ったのでした。

…え?Rustには不変な変数と可変な変数を分けられる文法があるって?みんなRustを使わなきゃ!(茶番)

余談

というような話をインターネットで圧縮して話したら

https://x.com/blackenedgold/status/1988164147834745325

全然伝わらず、水はやかんに入れろとか、英語だとお湯はboiled waterだとかの通知が100件オーバー届く羽目になりました。

GitHubで編集を提案

Discussion

Nobuo YamashitaNobuo Yamashita

面白いですね。
関数的に考えていると、操作対象ということをあまり意識してないなぁということに気付きました。