Uniform Function Call Syntax
Uniform Function Call Syntax( UFCS )またはUniform Calling Syntax( UCS )、または場合によっては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]
参照
参考文献
- ^ “Functions - D Programming Language”. Dlang.org. 1 October 2017閲覧。
- ^ “Programming in D - Universal Function Call Syntax (UFCS)”. Ddili.org. 1 October 2017閲覧。
- ^ “"Unified Call Syntax"” (PDF). Isocpp.org. 1 October 2017閲覧。
- ^ Francis Glassborow (2 May 2004). “N1585: Uniform Calling Syntax (Re-opening public interfaces)”. 17 December 2018閲覧。
- ^ “"UFCS proposal"” (PDF). Open-std.org. 1 October 2017閲覧。
- ^ “"Unified Call Syntax"” (PDF). Isocpp.org. 1 October 2017閲覧。""Unified Call Syntax"" (PDF). Isocpp.org. Retrieved 1 October 2017.
- ^ “using intellisense”. Msdn.microsoft.com. 1 October 2017閲覧。
- ^ “How Non-Member Functions improve encapsulation”. Drdobbs.com. 1 October 2017閲覧。