Fact-checked by Grok 2 weeks ago

Uniform function call syntax

Uniform function call syntax (UFCS), also referred to as uniform call syntax (UCS), is a programming language feature that enables the invocation of free-standing functions using method-like dot notation, where the first argument serves as the implicit object receiver, allowing x.f(y) to equate to f(x, y). This syntax unification bridges procedural and object-oriented calling conventions, promoting consistency in function invocation across different paradigms. UFCS was first prominently implemented in the D programming language, where the compiler resolves a call like a.fun() by first checking for a member function and, if absent, searching for a global function with a as its initial parameter. For instance, in D, the expression "D rocks".toLower calls the free function toLower on the string literal, outputting "d rocks", while more complex chaining such as [1, 2].chain([3, 4]).retro processes ranges fluidly to yield [4, 3, 2, 1]. Similarly, Nim supports UFCS through its method call syntax for procedures, rewriting obj.methodName(args) to methodName(obj, args) and allowing optional parentheses for zero-argument calls, as in echo "abc".len which is equivalent to echo len "abc". This feature extends to any first-argument type in Nim, not limited to objects, and includes disambiguation rules for generics, such as using x.p[ : T ] to invoke p[T](x). Beyond D and Nim, UFCS appears in languages like Koka and Effekt, though documentation on their specific implementations remains less detailed in primary sources. The primary motivations for UFCS include enhancing code readability, facilitating fluent interfaces for operation chaining, and improving encapsulation without requiring extension methods or overloading in all cases. In proposed extensions, such as Sutter's P3021R0 for C++, the syntax would generalize member calls x.f(a, b) to fallback on non-member f(x, a, b) while preserving , addressing limitations in and eliminating workarounds like pipe operators for ranges. This backward-compatible approach, demonstrated in experimental compilers like cppfront, aims to boost discoverability via tools and reduce cognitive overhead in distinguishing call styles. As of 2025, UFCS remains a in C++ and has been discussed for without formal adoption, highlighting its ongoing relevance in language evolution for more intuitive and scalable codebases.

Concept

Definition

Uniform function call syntax (UFCS), also known as uniform call syntax (UCS), is a programming language feature that enables developers to invoke any function using either free function notation, such as f(x, ...), or method-like dot notation, such as x.f(...), where the first argument x serves as the receiver without the function needing to be defined as a member of x's type. The core principle of UFCS is to unify function invocation syntax, allowing interchangeable use of both forms to improve code readability and flexibility while preserving the underlying function's free-standing nature. This unification relies on the language's function overloading resolution to match the call to the correct function based on argument types and signatures, ensuring unambiguous selection even when multiple candidates exist. Key characteristics of UFCS include its with namespaces and modules, which allows functions from various scopes to be resolved correctly via dot notation without namespace qualification in many cases, and its support for fluent of calls, enabling expressions like x.f(y).g(z) for more natural, sequential code flow. These traits enhance code reusability and scalability by decoupling syntax from membership.

Syntax and Usage

Uniform function call syntax (UFCS) enables the uniform treatment of free s and methods by allowing a free f(x, y) to be equivalently expressed as x.f(y), where x serves as the and the first . This syntactic relies on the f accepting the type as its initial , with subsequent s following. For functions with multiple s, the pattern extends naturally, such as f(x, y, z) becoming x.f(y, z). This syntax supports , where the return value of one call becomes the for the next, as in x.f(y).g(z), equivalent to nesting g(f(x, y), z). Such chaining facilitates fluent interfaces, particularly when operating on primitives or library-provided types, by allowing sequential transformations without intermediate variables. UFCS also integrates with , treating operators as functions that can be invoked in either or form within compatible contexts. In overload resolution, UFCS typically prioritizes member functions when a direct match exists on the receiver, falling back to free functions via argument-dependent lookup if needed; ambiguities arise if multiple overloads match both forms, requiring compiler-specific rules. Common usage patterns include applying algorithms to collections or manipulating basic types. For instance, sorting a list with a function can be written as a free call:
sort(myList, compareFunc)
or in UFCS form:
myList.sort(compareFunc)
Similarly, converting a string to uppercase uses:
toUpper(myString)
or:
myString.toUpper()
These forms promote interoperability, allowing developers to mix styles based on context without altering function definitions.

Implementations

In D

Uniform function call syntax (UFCS) was introduced in the D programming language with version 1.0, released in January 2007 by its creator, Walter Bright, as a fundamental aspect of D's design philosophy aimed at improving code expressiveness and flexibility. This feature allows free-standing functions to be invoked using method-like syntax on their first argument, blurring the distinction between free functions and member methods while promoting reusable, chainable code. A key mechanism of UFCS in D is the automatic conversion of free functions to method calls based on the first argument's type. For instance, a function toUpper(string s) can be called as s.toUpper(), where the resolves it by matching the object's type to the function's initial . This resolution occurs at through overload resolution, ensuring no runtime overhead and enabling seamless into existing codebases. UFCS fully supports templated functions, allowing operations to be applied uniformly; for example, a function like T square(T)(T a) { return a * a; } can be invoked as 5.square(). Additionally, functions annotated with User-Defined Attributes (UDAs) retain their when called via UFCS, facilitating advanced compile-time introspection and customization in library design. UFCS is particularly integrated with D's range-based programming model and the standard library's algorithms in Phobos. Functions from std.algorithm, such as filter or map, can be chained fluently on iterable types like arrays or ranges, mimicking object-oriented pipelines without requiring class methods. A representative example demonstrates this chaining:
d
import std.algorithm;
import std.range;
import std.stdio;

void main() {
    auto numbers = [1, 2, 3, 4, 5];
    auto evens = numbers.[filter](/page/Filter)!(a => a % 2 == 0).[map](/page/Map)!(a => a * a);
    writeln(evens);  // Outputs: [4, 16]
}
Here, filter and map are free functions treated as methods on the array, producing even squares through compile-time rewriting. Another example with strings illustrates basic equivalence:
d
import std.string;

void main() {
    string greeting = "hello";
    writeln(greeting.toUpper());  // Equivalent to toUpper(greeting), outputs: HELLO
}
This syntax supports array operations chaining, such as arr.sort().reverse(), where sort and reverse from std.algorithm are applied sequentially. One unique aspect of UFCS in D is its role in enabling "free functions as methods" for library authors, allowing extensions to built-in types or third-party structures without modifying their definitions, thus fostering modular and extensible designs. This approach aligns with D's emphasis on , where performance-critical code benefits from the zero-cost abstraction of compile-time resolution. In the evolution of , version 2.0, released in June 2010, introduced minor refinements to UFCS, particularly enhancing support for complex template instantiations and better interoperability with D's improved facilities. These updates solidified UFCS as a cornerstone for expressive, high-performance code in subsequent releases.

In Nim

supports Uniform Function Call Syntax (UFCS), a feature that enables the use of method-like dot notation for calling free-standing procedures, treating the first argument as the receiver. This leverages Nim's powerful overload resolution system to allow seamless switching between functional and object-oriented calling styles, aligning with the language's multi-paradigm design that emphasizes efficiency and expressiveness. The syntax permits expressions like x.f(y) for a f where x is the first , equivalent to the traditional f(x, y). This applies to procs (s), iterators, converters, and templates, provided the procedure's first has a concrete type. UFCS integrates with Nim's and structure; for instance, importing a module makes its procedures available for dot notation without additional qualifiers, promoting modular and readable . Parentheses can be omitted when no additional arguments are present, such as x.len instead of x.len().
nim
import strutils

let greeting = "hello".repeat(3)
echo greeting  # Outputs: hellohellohello
In the above example, "hello".repeat(3) invokes the repeat procedure from strutils using UFCS, equivalent to repeat("hello", 3). For sequences, UFCS facilitates fluent chaining of operations on collections:
nim
import sequtils, strutils

let numbers = @[1, 2, 3, 4, 5]
let evenStrings = numbers.filter(proc(n: int): bool = n mod 2 == 0)
                       .map(proc(n: int): string = $n)
echo evenStrings  # Outputs: @["2", "4"]
Here, filter and map are called via UFCS on the sequence, enabling concise pipelines similar to those in functional languages. UFCS significantly enhances code readability, especially in domain-specific languages (DSLs) constructed using Nim's macros and templates, by allowing natural, infix-like expressions without sacrificing performance. It supports compile-time evaluation within UFCS contexts, such as when the receiver is a constant, enabling optimizations and constructs. Nim's implementation avoids the need for explicit extension methods, as any compatible procedure automatically qualifies for UFCS, streamlining design in libraries and user code. The feature received refinements in Nim 1.0 (2019), which stabilized the language specification and improved overall compiler diagnostics, including for overload resolution scenarios relevant to UFCS.

In Koka and Effekt

In Koka, uniform function call syntax (UFCS) was introduced as part of the language's core design by Daan Leijen, enabling dot notation as syntactic sugar for ordinary function applications where the receiver serves as the first argument. This feature supports effectful computations by allowing seamless method-like calls on values within handler contexts, such as error handling via x.handle(e), which desugars to handle(x, e). Koka's type system, featuring higher-kinded polymorphic effects, integrates UFCS with effect handlers to compose operations without explicit effect threading; for instance, monadic chaining like x.map(f).flatMap(g) leverages UFCS to apply pure and effectful transformations uniformly, where map and flatMap are defined as functions with effect types like e list<b>.
koka
fun map(xs : list<a>, f : a -> e b) : e list<b> =
  match xs
    Cons(x,xx) -> Cons(f(x), map(xx,f))
    Nil        -> Nil

-- Usage with UFCS in effectful context
fun process() : console () {
  val xs = [1,2,3]
  xs.map(fn(x) x*2).traverse(fn(y) println(y.show))
}
This design promotes extensibility, as new "methods" can be added to existing types simply by defining compatible functions, while effect handlers ensure safe composition in functional pipelines. In Effekt, UFCS was incorporated into the language's syntax to facilitate effectful primitives, allowing calls like x.perform(op) as an alternative to perform(x, op), with support for delimited continuations underlying the effect system. Introduced around the language's foundational design in 2020, this feature integrates with region-based effects by enabling receiver-first notation for operations like resumption, such as x.resume(cont) versus the direct resume(x, cont), which abstracts continuation passing in handler scopes. Examples include list manipulations like l.size for size(l) or l.myAppend(other) , which chain effectful computations using blocks and handlers without disrupting the uniform call style.
effekt
def evenFibs(limit: [Int](/page/Int)) {
  with collect([limit](/page/Limit)) {
    with [filter](/page/Filter) { x => x % 2 == 0 } {
      genFibs()
    }
  }
}

-- UFCS in effect: genFibs uses do yield(x); resume(()) in handler
Both Koka and Effekt leverage UFCS to abstract effect passing, enhancing in functional paradigms by treating effects as first-class row-polymorphic types that propagate implicitly through calls, avoiding overload ambiguities via precise . This approach draws from academic research on algebraic effects post-2015, emphasizing handler-based control without boilerplate.

Proposals and Discussions

In C++

Proposals for uniform function call syntax (UFCS) in C++ have been discussed since 2014, aiming to allow non-member functions to be invoked using member function syntax without introducing breaking changes to the language. Initial ideas were presented by in N4165, which proposed enabling expressions like x.f(y) to resolve to a non-member f(x, y) when no suitable member function exists, leveraging argument-dependent lookup () for namespace resolution. This approach sought to unify call syntaxes while preserving existing overload resolution rules that favor as-written forms. Subsequent refinements, co-authored by Sutter and in N4474 and P0251R0, explored variations in lookup strategies, such as allowing free functions to find members or vice versa, but these faced rejection in committee votes due to concerns over complexity. The most recent iteration, P3021R0 by in 2023, revives the core concept of generalized member calls, emphasizing by only applying UFCS when no member function matches, thus avoiding in overload . Key features include support for to locate non-member functions in associated namespaces, enabling seamless integration with templates and lambdas—for instance, generic code using t.f(args) can invoke either member or non-member overloads uniformly. The proposal also maintains const-correctness by inheriting qualifiers from the object expression, ensuring that const x.f(y) resolves to const-overloads where applicable. Hypothetical examples illustrate this: a v could use v.sort() to invoke std::sort(v), or a auto sq = [](int x){ return x*x; }; could be called as 5.sq() after appropriate setup. Despite these advancements, challenges persist, including the risk of subtle overload resolution changes that could affect legacy code, particularly in scenarios involving multiple namespaces or partial specializations, and the added complexity to compiler implementations for handling unified lookups. As of November 2025, UFCS has not been adopted in C++23 or the ongoing C++26 standard, remaining under review for potential inclusion in future revisions, with experimental support available in tools like cppfront. This design uniquely positions UFCS to enable "extension methods" through free functions, allowing library authors to augment types without modifying their definitions, while aligning closely with C++'s existing dot syntax philosophy.

In Other Languages

In , discussions on adopting uniform function call syntax (UFCS) date back to at least 2014, with early forum threads exploring its potential to unify and free calls without formal Python Enhancement Proposal (PEP) advancement. By 2025, no core language adoption has occurred, though 2024 threads on the Python Discourse highlight UFCS's benefits for code fluency, such as enabling smoother in pipelines like load_data().filter(criteria).transform(). Libraries and extensions simulate UFCS-like behavior using Python's descriptor protocol; for instance, the justmagic package allows expressions like x.f(*args) to resolve as f(x, *args) by wrapping functions in descriptor classes that bind the receiver automatically. In Go, proposal #56242 from 2022 sought to introduce UFCS by permitting the first argument of any function to precede a dot notation, such as 123.strconv.Itoa() instead of strconv.Itoa(123), to facilitate chaining in contexts. The remains open as of November 2025, with discussions highlighting concerns about maintaining Go's , avoiding syntactic complexity that could complicate the language's readability and tooling. However, Go's feature, introduced in version 1.18 (2022), enables similar patterns through and type parameters, allowing reusable function chaining on collections without full UFCS—e.g., defining a Map interface method to mimic postfix calls. Typst, a markup-based system, saw a 2023 GitHub issue (#2558) proposing UFCS to enhance scripting fluency, particularly for chaining operations on primitives like text or layouts (e.g., text.size(12pt).bold()). As of 2025, the proposal remains open without full implementation, though version 0.7 (2024) introduced improved function handling for , offering partial postfix-like ergonomics in select contexts such as manipulation, without unifying all free functions. This aligns with Typst's focus on declarative , where UFCS could streamline ecosystem needs like automated pipelines. Brief academic explorations in leverage infix operators to achieve UFCS-like uniformity for binary functions, treating them as postfix or prefix via backticks (e.g., x op y as op x y), though this remains experimental and tied to functional paradigms rather than general method unification. In , no formal UFCS proposal has advanced by 2025, with discussions limited to informal explorations in language design forums, often declined in favor of existing extension methods for conformance. Across these languages, UFCS proposals frequently tie to ecosystem demands like data pipelines and fluent APIs, yet lack full standardization outside dedicated adopters, remaining experimental or simulated via existing mechanisms.

Usage in Rust

In Rust, the term "Uniform Function Call Syntax" (UFCS) specifically refers to a disambiguation mechanism for calling associated functions and methods on types or traits using a path-like syntax, such as <Type as Trait>::method(args) or Type::associated_fn(args), which allows these calls to resemble free function invocations without relying on type inference or dot notation. This syntax, which incorporates the "turbofish" operator ::<T> for specifying generic parameters when needed (e.g., Vec::<i32>::new()), was formalized to resolve ambiguities in generic and trait-bound contexts, ensuring explicit type resolution for associated items defined in impl blocks or trait implementations. The turbofish syntax, a key component of Rust's UFCS, enables precise specification of type parameters in function calls, particularly useful when the compiler cannot infer them from context, as in String::from("hello") for a non-generic call or <&str>::as_bytes(s) to explicitly invoke the as_bytes method on a string slice without ambiguity. This feature supports both inherent implementations (e.g., on structs like Vec) and trait methods, integrating seamlessly with Rust's type system to handle generics, traits, and impl blocks while adhering to borrowing and lifetime rules. For instance, in scenarios involving multiple trait implementations, UFCS disambiguates by qualifying the path, such as <MyType as MyTrait>::my_method(value). The term "turbofish" itself was coined in 2015 by community contributor Anna Harren in a discussion on Rust's path syntax, later adopted in official documentation around Rust 1.0's release. Historically, Rust's UFCS emerged with the language's 1.0 stable release in May 2015, as outlined in 0132, which extended path expressions to treat methods as first-class functions for greater expressiveness in styles and usage. Unlike the conventional UFCS in languages like or —where free functions can be invoked as object methods—Rust's variant does not enable the reverse; it exclusively facilitates calling methods and associated functions in a uniform, path-based manner to promote explicitness and avoid hidden dependencies on receiver types. This design choice aligns with Rust's emphasis on safety and clarity, particularly in unsafe code blocks and foreign function interfaces (FFI), where unambiguous calls prevent subtle errors in or type mismatches, and it remains deeply intertwined with the borrow checker to enforce semantics without implicit conversions. As of November 2025, 's UFCS remains consistent with its original design from the 2015 release, with no major enhancements or shifts toward the broader, bidirectional uniformity seen in other languages; the language prioritizes its existing explicit model to maintain compile-time guarantees. A common misconception is conflating 's UFCS with proposals in languages like C++, where the focus is on syntactic extensions for method-like calls on free functions; in , it serves as a tool rather than a uniformity overhaul, reinforcing the language's philosophy of explicit error-prone decisions over .

Comparisons with Extension Methods

Extension methods, first introduced in C# 3.0 in November 2007, enable developers to augment existing types with new static methods defined in a separate static class, where the first parameter is prefixed with the this keyword to indicate the type, allowing instance-method syntax without altering the original type. This feature was designed to support by extending types like IEnumerable<T> with query operators, promoting extensibility in object-oriented codebases. Similarly, Kotlin's extension functions, available since the language's initial release in , allow adding functions to classes using a type syntax, such as fun String.wordCount(): Int, which can then be invoked as "hello".wordCount(). Key differences between uniform function call syntax (UFCS) and extension methods lie in their design and requirements: UFCS, as implemented in and , achieves bidirectional uniformity by leveraging the language's overload to treat any free f(x, ...) as callable via x.f(...), enabling seamless conversion between functional and method styles without special declarations. In contrast, extension methods are unidirectional, transforming static functions into method-like calls but requiring explicit opt-in via the this or receiver parameter, and they do not necessitate overloading for the extension itself, making them viable even in languages without robust overload support. This makes UFCS more flexible for pure free functions, as it integrates them directly into the via existing overload rules, whereas extension methods are less adaptable for non-object contexts and treat extensions as namespace-scoped additions rather than unified syntax. Trade-offs in these approaches highlight distinct priorities: UFCS improves and in mixed-paradigm code by promoting dot notation for all applicable , but it can introduce during overload , potentially complicating decisions in complex scenarios. Extension methods, conversely, minimize core language changes by confining extensions to importable , avoiding ambiguities inherent to UFCS, though excessive use risks namespace pollution as multiple extension providers may introduce overlapping names visible in the same . A representative example illustrates these mechanics: In C#, a word-count extension is defined as a static in a dedicated class.
csharp
public static class StringExtensions
{
    public static int WordCount(this [string](/page/String) str)
    {
        return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
    }
}
This permits "The quick brown fox".WordCount(), but the remains a static call under the hood and cannot be invoked as a free function without explicit scoping. An equivalent in using UFCS simply defines a free procedure proc wordCount(s: [string](/page/String)): [int](/page/INT) = s.[split](/page/Split).len, callable as either wordCount("The quick brown fox") or "The quick brown fox".wordCount, with full overloading support for variants but without dedicated effect handling or templates in basic C# extensions. UFCS aligns well with functional-imperative hybrid languages like and , where it facilitates component-style programming by blurring lines between free functions and methods, supporting scalable chaining without retroactive type modifications. Extension methods, however, excel in object-oriented environments like C# and Kotlin, enabling targeted extensions to sealed or third-party types without language-level retrofitting, and there is no direct adoption overlap, as UFCS languages such as emphasize overload-driven uniformity over C#'s namespace-based opt-ins.

References

  1. [1]
    Uniform Function Call Syntax (UFCS) - Dlang Tour
    UFCS in D allows any call to a free function to be written as a member function call, enabling code reusability and scalability.
  2. [2]
  3. [3]
    [PDF] Unified function call syntax (UFCS) - Open Standards
    Oct 13, 2023 · UFCS aims to provide a single syntax for calling both member and non-member functions in C++, generalizing the member call syntax.
  4. [4]
    Uniform Function Call Syntax (UFCS) - Ideas - Python Discussions
    Aug 13, 2024 · Uniform Function Call Syntax allows you to write xf(*args, **kwargs) instead of f(x, *args, **kwargs).
  5. [5]
    Advantages of extension methods vs uniform function call syntax ...
    May 17, 2023 · Extension methods and Uniform Function Call Syntax (UFCS) are two different ways of letting you write a method call like foo.bar() without bar ...
  6. [6]
    Functions - D Programming Language
    Oct 10, 2025 · Simple getter and setter properties can be written using UFCS. These can be enhanced with the additon of the @property attribute to the function ...
  7. [7]
    Origins of the D Programming Language (HOPL IV - Papers)
    The language design was begun in late 1999. An alpha version appeared in 2001 and the initial language was completed, somewhat arbitrarily, at version 1.0 in ...Missing: UFCS | Show results with:UFCS<|control11|><|separator|>
  8. [8]
    Nim Manual - Nim Programming Language
    This document describes the lexis, the syntax, and the semantics of the Nim language. To learn how to compile Nim programs and generate documentation see the ...
  9. [9]
    Making uniform function call syntax more complete a ... - digitalmars.D
    Jun 16, 2012 · Static method lowering rules If function calls like the following are encountered... A) Type.compute(<ARGUMENTS>); B) Type.compute; // it's ...
  10. [10]
    digitalmars.D.announce - DMD 1.00 - here it is!
    D.announce - DMD 1.00 - here it is! Walter Bright (2/2) Jan 02 2007 http://www.digitalmars.com/d/changelog.html. Kyle Furlong (4/9) Jan 02 ...<|control11|><|separator|>
  11. [11]
    Functions - D Programming Language
    Summary of each segment:
  12. [12]
  13. [13]
  14. [14]
    Attributes - D Programming Language
    Oct 10, 2025 · User-Defined Attributes (UDA) are compile-time annotations that can be attached to a declaration. These attributes can then be queried, ...Missing: UFCS | Show results with:UFCS
  15. [15]
  16. [16]
  17. [17]
  18. [18]
    Change Log: List of All Versions - D Programming Language
    Change Log: List of all versions. Release schedule: Nightly (preview) - upcoming changes from master. 2.111.0 (Apr 01, 2025) 2.110.0 (Mar 07, 2025)
  19. [19]
  20. [20]
    Version 1.0 released
    ### Summary of Nim 1.0 Release (https://nim-lang.org/blog/2019/09/23/version-100-released.html)
  21. [21]
    1. Getting started - The Koka Programming Language
    An advantage of the dot notation as syntactic sugar for function calls is that it is easy to extend the 'primitive' methods of any data type: just write a ...Missing: uniform | Show results with:uniform
  22. [22]
    [1406.2061] Koka: Programming with Row Polymorphic Effect Types
    Jun 9, 2014 · Koka: Programming with Row Polymorphic Effect Types. Authors:Daan Leijen (Microsoft Research). Download PDF. Abstract: We propose a programming ...Missing: 1.0 UFCS
  23. [23]
    Functions - Effekt Language
    Calling functions works as you might expect: run fib(5). Perhaps unusual, you can also call fib using Effekt's implementation of Uniform Function Call Syntax :
  24. [24]
    [PDF] Effekt: Lightweight Effect Polymorphism for Handlers
    Oct 18, 2020 · We present the language Effekt with the goal to close the gap between research languages with effect handlers and languages for working ...
  25. [25]
    Introduction to Effekt - Effekt Language
    Additionally, Effekt also supports uniform-function call sytax and you can call the same function as l.size . ... Like constructors, records can be created with ...
  26. [26]
    C++26 Draft Finalized with Static Reflection, Contracts, and Sender ...
    Jun 27, 2025 · C++26 Draft Finalized with Static Reflection, Contracts, and Sender/Receiver Types. Jun 27, 2025 2 min read. by. Author photo Sergio De Simone.Missing: UFCS | Show results with:UFCS
  27. [27]
    hsutter/cppfront: A personal experimental C++ Syntax 2 - GitHub
    Cppfront is a compiler from an experimental C++ 'syntax 2' (Cpp2) to today's 'syntax 1' (Cpp1), to prove out some concepts, share some ideas, and prototype ...Wiki · Discussions · Pull requests 9 · Releases 7
  28. [28]
    Uniform Function Call Syntax (UFCS) | Python - Coding Forums
    Jun 7, 2014 · The language D has a feature called Uniform Function Call Syntax, which allows instance methods to be resolved using function calls.
  29. [29]
  30. [30]
    proposal: Go 2: Uniform Function Call Syntax #56242 - GitHub
    Oct 14, 2022 · You can call functions as if they are methods, provided the function takes as its first parameter, the type of thing that is to the left of the ...Missing: constructors | Show results with:constructors
  31. [31]
    An Introduction To Generics - The Go Programming Language
    Mar 22, 2022 · In Go 1.18 an interface may contain methods and embedded interfaces just as before, but it may also embed non-interface types, unions, and sets ...Missing: UFCS | Show results with:UFCS
  32. [32]
    Uniform Function Call Syntax · Issue #2558 - GitHub
    Nov 1, 2023 · Uniform Function Call Syntax is a feature of many high-level programming languages (notably Nim and ) that simplifies the language for new users.<|control11|><|separator|>
  33. [33]
    0.7.0 – Typst Documentation
    Version 0.7.0 (August 7, 2023). Text and Layout. Added support for floating figures through the placement argument on the figure function; Added support for ...Missing: v0. partial
  34. [34]
    Infix operator - Haskell « HaskellWiki
    Jun 25, 2021 · Overview. Functions in Haskell are usually called using prefix notation, or the function name followed by its arguments.Missing: UFCS | Show results with:UFCS
  35. [35]
    0132-ufcs - The Rust RFC Book
    Summary. This RFC describes a variety of extensions to allow any method to be used as first-class functions. The same extensions also allow for trait methods ...
  36. [36]
    Paths - The Rust Reference
    ### Summary on Turbofish Syntax, UFCS, Examples, and History
  37. [37]
    Method Syntax - The Rust Programming Language
    ### Summary of Method Syntax, UFCS, and Turbofish in Rust
  38. [38]
    Method call expressions - The Rust Reference
    ### Summary of UFCS and Turbofish Syntax in Rust
  39. [39]
    Call expressions - The Rust Reference
    In the past, the terms “Unambiguous Function Call Syntax”, “Universal Function Call Syntax”, or “UFCS”, have been used in documentation, issues, RFCs, and other ...
  40. [40]
    Extension members - C# - Microsoft Learn
    Extension methods are defined as static methods but are called by using instance method syntax. Their first parameter specifies which type the method operates ...Binding extension members at... · Common usage patterns
  41. [41]
    How to implement and call a custom extension method - C#
    Oct 3, 2024 · The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. The method operates on ...