仮引数=parameter、実引数=argument って違くね?

違うと断定していいかどうかは、なんつーか「歴史的事情」てのもありそうだし、(ワタシがここで言おうとしている)文脈依存なのね。

Python 翻訳の Transifex 用語集でこう定義されていてずっと違和感あってしょうがなかったんで、改めて考察してみた。

まず「日本語におけるテクニカルターム」としての実引数、仮引数の違いは、「方向」の違いである。つーか、「らしい」。なんせアタシは「コンピュータ的な正規の教育」は、大学時代の Fortran のためのものだけだったし、これを教わった記憶は確かにあるものの、もう20年近く前ですもの、忘れていたさ。簡単だよ、これだけのこと:

  • 仮引数は「受け取り手目線」(渡せよ、をらぁ)
  • 実引数は「呼び出し側目線」(受け取れや、ごるぁ)

で、WikiPedia での説明では英語との対応をこう説明している:

  • 仮引数: parameter、formal parameter (argument))
  • 実引数: argument、actual argument (parameter)

というわけで確かに「仮引数=parameter、実引数=argument」とみなすことは確かにあるということがわかる。けれど同時に「仮引数=formal argument、実引数=actual parameter」だとも言っていることに注目すべきである。つまり英語話者でも parameter そのものに「仮引数」の意味を込めないこともあるし、argument に実引数の意味を込めないこともある、ってことだ。

最終的に何が言いたいかと言うと、

  • 「parameter」を見つけたぜ、へへ、知ってるもんね、これをパラメータと言ったり引数というヤツは無知だ、「仮引数」のことなんだぜ
  • 「argument」を見つけたぜ、へへ、知ってるもんね、これを引数というヤツは無知だ、「実引数」のことなんだぜ

なんて発想を誘導してしまう用語集って、ダメだろ、ってこと。

先の WikiPedia での例でも納得出来る人もいるだろうけど、話を続ける。

まず、「プログラミングな文脈でない argument」には、本来は「議論」とか「議論の対象」「興味の対象」という意味がある。これについては以前こんなのを書いた。同じく parameter は、もともとは数学での「媒介変数、助変数」。仮置きする変数、なのよね。

つまりプログラミング言語において関数(等)定義(宣言)時に「引数」について言及する文脈では、argument と parameter では意味に違いはなくて、どちらも「受け取りたい仮の媒介変数」「受け取りたい興味の対象」、なのだが、英語ドキュメントを見慣れていないと納得しない人もいるかもしれない。けれど実際に何か全体読んでみればいい。ドキュメントの著者はまず十中八九これらを使い分けてない。(同じものだと暗に前提にしている。)

著者が使い分けていない以上は、「仮引数=parameter、実引数=argument」は絶対に NG である。どうしてもという場合は formal、actual を補うであろう。(要は原文ドキュメントがこれらを厳密に使い分けているかどうかを見極めたうえで判断せよ、ってことである。)

なんでこんなことが起こるかなんて簡単である。API のドキュメントの 99% は「仮引数」を説明するもんであって、あえて実引数を説明するなんてことはないからだ。そりゃぁそうであろう。「おぬし、これに渡せ」の説明をばしたいんであって、「あんたが渡したこの値」をドキュメントしたい場合なんか、そうそうない。

用語集って難しいよな、って話でした。ん? そういう話だっけ?










2016-03-08 追記:
Python 翻訳プロジェクトの用語集はやはり実害ありそうなので、Transifex の用語集には手をいれた。

ただそこに「コメント」を入れれるんだけれど、そこで説明をちゃんとしようとするとなかなかむつかしいのね。最初に書いた通りで「確かにそうである場合もある」から、誰もがちゃんと腑に落ちる説明をしようとすると結構繊細なのだわ。

で何度も書き直しながら気付いたのはこの事実:

  1. 「この引数に値 “hoge” を渡す」
  2. 「この仮引数の値として実引数 “hoge” を渡す」
  3. 「このパラメータに実引数として “hoge” を渡す」

どれも同じ。

要は「実引数と仮引数を区別する言い回しで説明する」のと「区別しない言い回しで説明する」のの行き来って自由自在なんだよね、まったくもって。これは英語でも全く同じ。そして大事なのは、以下は絶対に成立しないということ:

  1. 「この実引数に仮引数 “hoge” を渡す」
  2. 「この実引数の値としてパラメータ “hoge” を渡す」
  3. 「このパラメータに仮引数として “hoge” を渡す」

わかる? 「区別する場合に限り区別が厳密に行われなければならない」ということ。だったら区別しなきゃいい、フツーは。