Uniform Function Call SyntaxUFCS )またはUniform Calling SyntaxUCS )、または場合によってはUniversal Function Call Syntaxは、 D言語およびNimプログラミング言語の機能であり、オブジェクト指向プログラミング言語のようにメソッド呼び出しの構文を使用して任意の関数を呼び出すことができます。 関数の第一引数をレシーバーとして使用し、残りの引数をメソッドの引数として使用します。 [1] UFCSは、関数呼び出しがチェインされている場合に特に役立ちます[2] (パイプ、または一連のを介して値を渡すために関数型言語で使用できるさまざまな専用演算子に似ています)。これにより、フリー関数は、他のいくつかの言語の拡張メソッドと同様の役割を果たすことができます。メソッド呼び出し構文のもう1つの利点は、 IDEの「ドットオートコンプリート」で使用することです。これは、タイプ情報を使用して、コンテキストに応じて使用可能な関数のリストを表示します。プログラマーが引数を入力すると、潜在的に適用可能な関数のセットが大幅に絞り込まれ[3] 、発見可能性が向上します。

編集

Nimプログラミング言語 編集

type Vector = tuple[x, y: int]
 
proc add(a, b: Vector): Vector =
 (a.x + b.x, a.y + b.y)
 
let
 v1 = (x: -1, y: 4)
 v2 = (x: 5, y: -2)
 
 # 以下は全て正しい
 v3 = add(v1, v2)
 v4 = v1.add(v2)
 v5 = v1.add(v2).add(v4)

Dプログラミング言語 編集

import std.stdio;

int first(int[] arr)
{
  return arr[0];
}

int[] addone(int[] arr)
{
  int[] result;
  foreach (value; arr) {
    result ~= value + 1;
  }
  return result;
}

void main()
{
  auto a = [0, 1, 2, 3];

  // 以下は全て正しく、等価である
  int b = first(a);
  int c = a.first();
  int d = a.first;

  // チェイン
  int[] e = a.addone().addone();
}

C++ における提案 編集

メンバー関数とフリー関数呼び出し構文の統合の提案は、C++標準化の初期から議論されてきました。 Glassborow(2004)は、Uniform Calling Syntax(UCS)を提案しました。これにより、特別に注釈が付けられたフリー関数をメンバー関数表記で呼び出すことができます。 [4]最近(2016年現在)、 BjarneStroustrup [5]とHerbSutter [6]によって、C++に追加することが提案されました。これは、フリー関数とメンバー関数の記述のあいまいな判定を減らし、テンプレートコードの記述を簡素化するためです。多くのプログラマーは、メンバー関数構文の利点を得るためにメンバー関数を作成しようとします(たとえば、メンバー関数をリストするための「ドットオートコンプリート」)。 [7]ただし、これはクラス間の過度の結合につながります。 [8]

参照 編集

参考文献 編集

  1. ^ Functions - D Programming Language”. Dlang.org. 2017年10月1日閲覧。
  2. ^ Programming in D - Universal Function Call Syntax (UFCS)”. Ddili.org. 2017年10月1日閲覧。
  3. ^ "Unified Call Syntax"” (PDF). Isocpp.org. 2017年10月1日閲覧。
  4. ^ Francis Glassborow (2004年5月2日). “N1585: Uniform Calling Syntax (Re-opening public interfaces)”. 2018年12月17日閲覧。
  5. ^ "UFCS proposal"” (PDF). Open-std.org. 2017年10月1日閲覧。
  6. ^ "Unified Call Syntax"” (PDF). Isocpp.org. 2017年10月1日閲覧。""Unified Call Syntax"" (PDF). Isocpp.org. Retrieved 1 October 2017.
  7. ^ using intellisense”. Msdn.microsoft.com. 2017年10月1日閲覧。
  8. ^ How Non-Member Functions improve encapsulation”. Drdobbs.com. 2017年10月1日閲覧。