Uniform function call syntax: Difference between revisions

Content deleted Content added
Ilyash-b (talk | contribs)
Add Next Generation Shell as a language that also implements the feature
Uniform function call syntax was already mentioned
 
(38 intermediate revisions by 27 users not shown)
Line 1:
{{Short description|Programming language feature}}
{{Primary sources|date=September 2017}}
'''Uniform Functionfunction Callcall Syntaxsyntax''' ('''UFCS''') or '''Uniformuniform Callingcall Syntaxsyntax''' ('''UCS''') or sometimes '''Universal Function Call Syntax''' is a [[programming language]] feature in [[D (programming language)|D]],<ref name=":0" /> [[Nim (programming language)|Nim]],<ref>{{Cite web |title=Nim by Example - Procs |url=https://nim-by-example.github.io/procs/ |access-date=2024-05-19 |website=nim-by-example.github.io}}</ref> Koka,<ref>{{Cite web |title=The Koka Programming Language |url=https://koka-lang.github.io/koka/doc/book.html |access-date=2024-05-19 |website=koka-lang.github.io}}</ref> and [[NextEffekt<ref>{{Cite Generationweb Shell]]|title=Functions |url=https://effekt-lang.org/tour/functions |access-date=2025-04-09 |website=Effekt Language}}</ref> that allows any [[function (computer programming)|function]] to be called using the syntax for method calls (as in [[object-oriented programming]]), by using the [[receiver (object oriented programming)|receiver]] as the first parameter, and the given arguments as the remaining parameters.<ref>{{cite web |url=http://dlang.org/function.html#pseudo-member |title=Functions - D Programming Language|website=Dlang.org|accessdate=1D October 2017}}</ref> UFCS is particularly useful when function calls are chained<ref>{{cite web|url=http://ddili.org/ders/d.en/ufcs.html|title=Programming inLanguage D - Universal Function Call Syntax (UFCS)|website=Ddili.org|accessdate=1 October 2017}}</ref> (behavingThe similarsame totechnique [[Pipeis (computerused science)|pipe]]s, orin the various dedicated [[Operator (computer programming)|operatorAviSynth]]s available in [[functionalscripting language]]s for passing values through a series of [[Expression (computer science)|expression]]s). It allows free-functions to fill a role similar to [[extension method]]s in some other languages. Another benefit ofunder the methodname call syntax is use with"OOP notation"[[dot-autocomplete]]" in [[IDE (computing)|IDE]]s, which use type information to show a list of available functions, dependent on the context. When the programmer starts with an argument, the set of potentially applicable functions is greatly narrowed down,<ref name="auto">{{cite web |title="UnifiedOperators Call|website=Avisynth wiki Syntax"|url=httpshttp://isocppavisynth.orgnl/files/papers/N4165index.pdfphp/Operators#Operator_Precedence |formatquote=PDF|website=Isocpp<code>a.org|accessdate=1function(b)</code> Octoberis 2017equivalent to <code>function(a, b)</code>}}</ref> aiding discoverability.
 
UFCS is particularly useful when function calls are chained<ref name=":0">{{cite web |url=http://ddili.org/ders/d.en/ufcs.html |title=Universal Function Call Syntax (UFCS) |website=Programming in D |accessdate=1 October 2017}}</ref> (behaving similar to [[Pipe (computer science)|pipes]], or the various dedicated [[Operator (computer programming)|operators]] available in [[functional language]]s for passing values through a series of [[Expression (computer science)|expressions]]). It allows free functions to fill a role similar to [[extension method]]s in some other languages. Another benefit of the syntax is related to completion systems in [[Integrated development environment|IDEs]], which use type information to show a list of available functions, dependent on the context. When the programmer starts with an argument, the set of potentially applicable functions is greatly narrowed down,<ref name="auto">{{cite web |title=Unified Call Syntax |url=https://isocpp.org/files/papers/N4165.pdf |website=Isocpp.org |accessdate=1 October 2017}}</ref> aiding [[discoverability]].
== C++ proposal ==
Proposals for a unification of member function and free function calling syntax have been discussed from the early years of C++ standardization. Glassborow (2004) proposed a Uniform Calling Syntax (UCS), allowing specially annotated free functions to be called with member function notation.<ref>{{cite web|title=N1585: Uniform Calling Syntax (Re-opening public interfaces)|author=Francis Glassborow|date=2 May 2004|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1585.pdf|accessdate=17 December 2018}}</ref>
It has more recently been proposed (as of 2016) for addition to C++ by [[Bjarne Stroustrup]]<ref>{{cite web|title="UFCS proposal"|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4174.pdf|format=PDF|website=Open-std.org|accessdate=1 October 2017}}</ref> and [[Herb Sutter]],<ref name="auto"/> to reduce the ambiguous decision between writing [[free function (c++)|free function]]s and member functions, to simplify the writing of [[generic programming|templated code]]. Many programmers are tempted to write member functions to get the benefits of the member function syntax (e.g. "[[dot-autocomplete]]" to list [[member function]]s);<ref>{{cite web|title=using intellisense|url=https://msdn.microsoft.com/en-us/library/hcw1s69b.aspx|website=Msdn.microsoft.com|accessdate=1 October 2017}}</ref> however, this leads to excessive [[Coupling (computer programming)|coupling]] between [[Class (computer programming)|classes]].<ref>{{cite web|title="How Non-Member Functions improve encapsulation|url=http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197|website=Drdobbs.com|accessdate=1 October 2017}}</ref>
 
== Examples ==
=== D programming language ===
<sourcesyntaxhighlight lang="Dd">
import std.stdio;
 
int first(int[] arr)
{
Line 29 ⟶ 25:
auto a = [0, 1, 2, 3];
 
// Allall the following are correct and equivalent
int b = first(a);
int c = a.first();
int d = a.first;
 
// Chainingchaining
int[] e = a.addone().addone();
}
</syntaxhighlight>
</source>
 
=== Nim programming language ===
<sourcesyntaxhighlight lang="Nimnim">
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)
 
# all the following are correct
v3 = add(v1, v2)
v4 = v1.add(v2)
v5 = v1.add(v2).add(v1v4)
</syntaxhighlight>
</source>
 
== C++ proposal ==
Proposals for a unification of member function and free function calling syntax have been discussed from the early years of [[C++]] standardization. Glassborow (2004) proposed a Uniformuniform Callingcalling Syntaxsyntax (UCS), allowing specially annotated free functions to be called with member function notation.<ref>{{cite web |title=N1585: Uniform Calling Syntax (Re-opening public interfaces) |author=Francis Glassborow |date=2 May 2004 |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1585.pdf |accessdate=17 December 2018}}</ref>
ItIn has more2016 recentlyit beenwas proposed (asa ofsecond 2016)time for addition to C++ by [[Bjarne Stroustrup]]<ref>{{cite web |title="UFCS proposal" |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4174.pdf|format=PDF |website=Open-std.org |accessdate=1 October 2017}}</ref> and [[Herb Sutter]],<ref name="auto"/> to reduce the ambiguous decision between writing [[free functionFunction (ccomputer programming)#C and C++)|free functionfunctions]]s and member functions, to simplify the writing of [[generic programming|templated code]]. Many programmers are tempted to write member functions to get the benefits of the member function syntax (e.g. "[[Code completion|dot-autocomplete]]" to list [[member function]]s);<ref>{{cite web |title=usingUsing IntelliSense intellisense|url=https://msdn.microsoft.com/en-us/library/hcw1s69b.aspx |website=Msdn.microsoft.comMSDN |accessdate=1 October 2017}}</ref> however, this leads to excessive [[Coupling (computer programming)|coupling]] between [[Class (computer programming)|classes]].<ref>{{cite web |title="How Non-Member Functions improveImprove Encapsulation encapsulation|url=httphttps://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197 |website=Drdobbs.com |accessdate=1 October 2017}}</ref> This was again, in 2023, proposed by Herb Sutter<ref>{{Cite web |last=Sutter |first=Herb |date=13 October 2023 |title=Unified function call syntax (UFCS) |url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p3021r0.pdf }}</ref> claiming new information and insights, as well as an experimental implementation in the cppfront compiler.
 
== Rust usage of the term ==
Until 2018, it was common<ref>{{Cite web |title=Rename UFCS to accurately reflect its functionality. · Issue #1140 · rust-lang/rfcs |url=https://github.com/rust-lang/rfcs/issues/1140 |access-date=2024-05-19 |website=GitHub |language=en}}</ref> to use this term when actually referring to ''[https://github.com/rust-lang/rfcs/issues/1140#issuecomment-108644620 qualified/explicit path syntax]'' and most commonly the ''[https://doc.rust-lang.org/1.30.0/book/2018-edition/ch19-03-advanced-traits.html?highlight=trait,function,call#fully-qualified-syntax-for-disambiguation-calling-methods-with-the-same-name Fullyfully Qualifiedqualified Pathpath syntax].'': because it's is possible to have several traits defining the same method implemented on the same struct, a mechanism is needed to disambiguate which trait should be used. Member functions can also be used as free functions through a qualified (namespaced) path. The term UFCS is incorrect for these uses, as it allows using methods as (namespaced) free functions, but not using free functions as methods.
 
== See also ==
Member functions can also be used as free functions through a qualified (namespaced) path.
* [[traitTrait (computer programming)]]
 
* [[interfaceInterface (computer programming)]]
The term UFCS is incorrect for these uses, as it allows using methods as (namespaced) free functions, but not using free functions as methods.
 
==See also==
* [[trait (computer programming)]]
* [[interface (computer programming)]]
* [[Go (programming language)]], another language with a more open philosophy to methods
* [[Loose coupling]]
* [[Duck typing]]
* [[Method chaining]]
 
== References ==
{{Reflist}}
 
[[Category:Articles with example code]]
[[Category:SourceArticles with example D code]]
[[Category:Object-oriented programming]]
[[Category:Source code]]
[[Category:Subroutines]]
[[Category:Articles with example code]]