La Sintaxis Uniforme de Llamada a Función ( UFCS ) o Sintaxis de Llamada Uniforme ( UCS ) o a veces Sintaxis Universal de Llamada a Función es una característica del lenguaje de programación en D , [1] Nim , [2] Rust , [3] Koka, [4] y Effekt [5] que permite llamar a cualquier función usando la sintaxis para llamadas a métodos (como en la programación orientada a objetos ), usando el receptor como primer parámetro y los argumentos dados como los parámetros restantes. [6] La misma técnica se utiliza en el lenguaje de scripting AviSynth bajo el nombre de "notación OOP". [7]
UFCS es particularmente útil cuando las llamadas de función están encadenadas [1] (comportándose de manera similar a las tuberías o los diversos operadores dedicados disponibles en lenguajes funcionales para pasar valores a través de una serie de expresiones ). Permite que las funciones libres cumplan una función similar a los métodos de extensión en algunos otros lenguajes. Otro beneficio de la sintaxis está relacionado con los sistemas de finalización en los IDE , que utilizan información de tipo para mostrar una lista de funciones disponibles, dependiendo del contexto. Cuando el programador comienza con un argumento, el conjunto de funciones potencialmente aplicables se reduce en gran medida, [8] lo que ayuda a la capacidad de descubrimiento .
Ejemplos
Lenguaje de programación D
int primero ( int [] arr ) { devolver arr [ 0 ]; }
int [] addone ( int [] arr ) { int [] resultado ; foreach ( valor ; arr ) { resultado ~= valor + 1 ; } return resultado ; }
vacío principal () { auto a = [ 0 , 1 , 2 , 3 ];
// todas las siguientes son correctas y equivalentes
int b = first ( a ); int c = a . first ;
// encadenamiento
int [] e = a . complemento (). complemento (); }
Lenguaje de programación Nim
tipo Vector = tupla [ x , y : int ]
proc add ( a , b : Vector ) : Vector = ( a.x + b.x , a.y + b.y )
sea
v1 = ( x : - 1 , y : 4 ) v2 = ( x : 5 , y : - 2 )
# todas las siguientes son correctas
v3 = add ( v1 , v2 ) v4 = v1 . add ( v2 ) v5 = v1 . add ( v2 ). add ( v4 )
Propuesta en C++
Las propuestas para una unificación de la sintaxis de llamada de funciones miembro y funciones libres se han discutido desde los primeros años de la estandarización de C++ . Glassborow (2004) propuso una Sintaxis de Llamada Uniforme (UCS), que permite llamar a funciones libres especialmente anotadas con notación de función miembro. [9] En 2016, Bjarne Stroustrup [10] y Herb Sutter [8] propusieron una segunda adición a C++ para reducir la decisión ambigua entre escribir funciones libres y funciones miembro, para simplificar la escritura de código con plantilla . Muchos programadores se sienten tentados a escribir funciones miembro para obtener los beneficios de la sintaxis de la función miembro (por ejemplo, "dot-autocomplete" para enumerar las funciones miembro ); [11] sin embargo, esto conduce a un acoplamiento excesivo entre clases . [12] Esto ha sido propuesto nuevamente, en 2023, por Herb Sutter [13] afirmando nueva información y conocimientos, así como una implementación experimental en el compilador cppfront.
Uso del término Rust
Hasta 2018, era común [14] utilizar este término cuando se hacía referencia a la sintaxis de ruta calificada/explícita y, más comúnmente, a la sintaxis de ruta completamente calificada: debido a que es posible tener varios rasgos que definen el mismo método implementado en la misma estructura, se necesita un mecanismo para desambiguar qué rasgo se debe utilizar. Las funciones miembro también se pueden utilizar como funciones libres a través de una ruta calificada (con espacio de nombres). El término UFCS es incorrecto para estos usos, ya que permite utilizar métodos como funciones libres (con espacio de nombres), pero no utilizar funciones libres como métodos.
Véase también
- Rasgo (programación informática)
- Interfaz (programación informática)
- Go (lenguaje de programación) , otro lenguaje con una filosofía más abierta a los métodos
- Acoplamiento flojo
- Pato escribiendo
- Encadenamiento de métodos
Referencias
- ^ ab "Programación en D - Sintaxis de llamada a función universal (UFCS)". Ddili.org . Consultado el 1 de octubre de 2017 .
- ^ "Nim by Example - Procs". nim-by-example.github.io . Consultado el 19 de mayo de 2024 .
- ^ "Expresiones de llamada - Referencia de Rust". doc.rust-lang.org . Consultado el 22 de septiembre de 2024 .
- ^ "El lenguaje de programación Koka". koka-lang.github.io . Consultado el 19 de mayo de 2024 .
- ^ "Lenguaje Effekt: Introducción a Effekt". Lenguaje de efectos . Consultado el 19 de mayo de 2024 .
- ^ "Funciones - Lenguaje de programación D". Dlang.org . Consultado el 1 de octubre de 2017 .
- ^ "Operadores - Wiki de Avisynth".
es equivalente a
a.function(b)function(a, b) - ^ ab ""Sintaxis de llamada unificada"" (PDF) . Isocpp.org . Consultado el 1 de octubre de 2017 .
- ↑ Francis Glassborow (2 de mayo de 2004). «N1585: Sintaxis de llamada uniforme (Reapertura de interfaces públicas)» (PDF) . Consultado el 17 de diciembre de 2018 .
- ^ ""Propuesta UFCS"" (PDF) . Open-std.org . Consultado el 1 de octubre de 2017 .
- ^ "Uso de intellisense". Msdn.microsoft.com . Consultado el 1 de octubre de 2017 .
- ^ "Cómo las funciones no miembro mejoran la encapsulación". Drdobbs.com . Consultado el 1 de octubre de 2017 .
- ^ Sutter, Herb (13 de octubre de 2023). "Sintaxis unificada de llamada a función (UFCS)" (PDF) .
- ^ "Cambiar el nombre de UFCS para reflejar con precisión su funcionalidad. · Problema n.° 1140 · rust-lang/rfcs". GitHub . Consultado el 19 de mayo de 2024 .