Función anónima

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 7 de abril de 2018; las comprobaciones requieren 29 ediciones .

Una función anónima en programación  es un tipo especial de funciones que se declaran en el lugar de uso y no reciben un identificador único para acceder a ellas. Compatible con muchos lenguajes de programación .

Por lo general, cuando se crean funciones anónimas, se las llama directamente o se asigna una referencia a la función a una variable , que luego se puede usar para llamar indirectamente a esta función. Pero en este último caso, la función anónima recibe un nombre y deja de ser anónima. Si una función anónima se refiere a variables que no están contenidas en su cuerpo (captura), entonces dicha función se llama cierre . Una expresión lambda es una construcción sintáctica común a muchos lenguajes para definir una función anónima.

Sintaxis

La sintaxis para escribir funciones anónimas para diferentes lenguajes de programación en la mayoría de los casos varía mucho.

Idioma Ejemplo de notación de suma
AS3 función ( x : int , y : int ): int { devuelve x + y ;}
C# ( x , y ) => x + y
C++ Introducido en C++11. El agarre y el cuerpo deben estar presentes. Forma larga [1] : [ captura ]( parámetros ) atributos de excepciones mutables - > return_type { cuerpo } Ejemplo [2] : []( int x , int y ){ devuelve x + y ; }

C ++ 14 agregó la capacidad de usar funciones lambda con auto[3] :

auto lambda = []( auto x , auto y ) { return x + y ;}; Una función anónima puede capturar como variables separadas, así:en un ; auto f = [ a ](){ devuelve a ;} y todas las variables externas: por referencia [&] o por copia [=] . También puede combinar estos enfoques: por ejemplo, capturar todas las variables por referencia y ciertos parámetros por copia. Para poder modificar las variables capturadas por valor, debe especificar la palabra clave mutable al declarar una función. C++14 agrega la capacidad de inicializar variables lambda en una captura. Por ejemplo:[ a = std :: cadena {}](){ devuelve a ;}
CaféScript (x, y) -> x + y
D // forma abreviada con inferencia de tipo automático auto  a  =  (( x ,  y )  =>  x  +  y )( 2 ,  3 ); // notación de formato largo (bloque de llaves) con inferencia de tipo automático auto  aa  =  ( x ,  y )  {  return  x  +  y ;  }( 2 ,  3 ); // Detección automática del compilador del tipo de función anónima: función o delegado automático  b  =  ( int  x ,  int  y )  =>  x  +  y ; auto  bb  =  ( int  x ,  int  y )  {  return  x  +  y ;  }; // las funciones no tienen acceso a variables externas auto  c  =  function ( int  x ,  int  y )  =>  x  +  y ; auto  cc  =  función ( int  x ,  int  y )  {  return  x  +  y ;  }; // los delegados tienen acceso a las variables externas auto  d  =  delegado ( int  x ,  int  y )  =>  x  +  y ; auto  dd  =  delegar ( int  x ,  int  y )  {  return  x  +  y ;  }; // delegado que toma una variable int y devuelve un valor doble auto  f  =  delegado  doble ( int  x )  {  return  5.0  /  x ;  };
Delphi (desde la versión 2009) función ( x , y : entero ) : entero empieza resultado := x + y ; fin ;
Erlang divertido ( X , Y ) -> X + Y fin
Octava GNU @( x , y ) x + y
Vamos Z := func () int { retornar X + Y }()
maravilloso { x , y -> x + y }
Haskell \ x y -> x + y
Java (desde la versión 8) // sin parámetro () -> System . fuera _ println ( "Hola mundo" ); // con un solo parámetro (Este ejemplo es una función de identidad). un -> un //con una sola expresión ( a , b ) -> a + b // con información de tipo explícito ( ID largo , nombre de cadena ) -> "id:" + id + ", nombre:" + nombre // con un bloque de código ( a , b ) -> { return a + b ;} // con múltiples sentencias en el cuerpo lambda. Requiere un bloque de código. // Este ejemplo también incluye una expresión lambda anidada, así como un cierre. ( id , nuevoPrecio ) -> { Opcional < Producto > mayBeProduct = findProduct ( id ); mayBeProduct . ifPresent ( producto -> producto . setPrecio ( nuevoPrecio )); devolver mayBeProduct . obtener (); }
JavaScript Una expresión de función de flecha siempre se declara sin nombre. Se agregaron funciones de flecha al estándar ECMAScript 6 (también conocido como ECMAScript 2015) [4] . // Función de flecha. ES6+ (ES2015+) ( x , y ) => x + y ; Declarar una función a través de una expresión de función sin especificar un nombre. Este método se describió por primera vez en la especificación del estándar ECMAScript 3 [5] [6] . // expresión de la función. Función ES3+ ( x , y ) { devuelve x + y }

La creación dinámica de una función por un constructor de un objeto Función (Function constructor) siempre se declara sin nombre. Una notación más corta para la creación de funciones dinámicas es una llamada de función que llama automáticamente al constructor de funciones con los mismos parámetros. Estas formas de crear funciones han existido desde las primeras especificaciones, comenzando con ECMAScript First Edition [7] [8] .

// Creación dinámica de una función por el constructor de funciones. ES1+ nueva función ( 'x' , 'y' , 'return x + y' ) // Notación más corta. Función ES1+ ( 'x' , 'y' , 'retornar x + y' )
Lúa función ( x , y ) devuelve x + y fin
arce ( x , y ) -> x + y
Matemática #1 + #2 &

o

Función [ #1 + #2 ]

o

Función [{ x , y }, x + y ] [9] [10]
MATLAB f =@( x , y ) x + y
Máxima lambda ([ x,y ] , x+y )
Nim proceso ( x , y : int ): int = x * y
PascalABC.NET ( x , y ) -> x + y
Perl sub { regresar $_ [ 0 ] + $_ [ 1 ] } [once]
PHP // PHP 7.4+ fn ( $x , $y ) => $x + $y ;

Las funciones de flecha se agregaron en PHP 7.4 [12] .

// Función de PHP 5.3+ ( $x , $y ) use ( $a , & $b ) { return $x + $y ; }

Aquí $a, $b son variables capturadas, mientras que la variable $b también está cerrada [13] [14] .

// PHP 4.0.1+ create_function ( ' $x, $y' , 'return $x + $y;' )

Crear una función anónima con create_function [15] . Este método está en desuso desde PHP 7.2.0.

Potencia Shell { parámetro ( $x , $y ) $x + $y } [dieciséis]
Pitón lambda x , y : x + y [17]
R función ( x , y ) x + y
rubí lambda { | x , y | x + y } [Dieciocho]
Óxido | x : i32 , y : i32 | x + y
Scala

Sin especificar el contexto, debe especificar el tipo de variables:

( x : Int , y : Int ) => x + y

Pero en lugares donde se puede inferir el tipo, se pueden usar formas abreviadas:

( 1 a 100 ) reducir (( a , b ) => a + b )

O incluso más corto, usando sustituciones automáticas '_':

( 1 a 100 ) reducir ( _ + _ )
Esquema , ceceo común ( lambda ( x y ) ( + x y ))
SML fn ( x , y ) => x + y
Rápido // 1 opción let f : ( Int , Int ) -> Int = { x , y devuelve x + y } // 2da opción sea f : ( Int , Int ) -> Int = { x , y en x + y } /* Nombres de parámetros abreviados */ // 1ra opción let f : ( Int , Int ) -> Int = { return $0 + $1 } // 2da opción sea f : ( Int , Int ) -> Int = { $0 + $1 }
mecanografiado // Una expresión de función de flecha siempre se declara sin nombre ( x , y ) => x + y // expresión de función (expresión de función) sin nombre function ( x , y ) { return x + y } // Creación dinámica de una función // por un constructor de objetos Function (Function constructor) // siempre declarada sin nombre new Function ( 'x' , 'y' , 'return x + y' ) // Notación más corta para la creación de funciones dinámicas. // Llamar a una función invoca automáticamente // al constructor de la función con los mismos parámetros Función ( 'x' , 'y' , 'return x + y' )
Prólogo visual {( X , Y ) = X + Y }

Véase también

Notas

  1. Funciones anónimas . Fecha de acceso: 21 de febrero de 2016. Archivado desde el original el 21 de febrero de 2016.
  2. C++11. Expresiones Lambda . Consultado el 25 de agosto de 2010. Archivado desde el original el 9 de octubre de 2010.
  3. Sutter, Herb Trip Report: reunión de primavera de 2013 de ISO C++ . isocpp.org (20 de abril de 2013). Consultado el 14 de junio de 2013. Archivado desde el original el 20 de agosto de 2017.
  4. Funciones de flecha (HTML). Documentos web de MDN . Red de desarrolladores de Mozilla. Consultado el 27 de septiembre de 2019. Archivado desde el original el 19 de agosto de 2019.
  5. Especificación del lenguaje ECMAScript . Edición 3 Final  (Inglés) (PDF) . Archivo mozilla.org Pág. 79 . Suiza, CH-1204 Ginebra, 114 Rue du Rhone: ECMA (24 de marzo de 2000) .  — Especificación del estándar ECMAScript (ECMA-262). Tercera edicion. Consultado el 27 de septiembre de 2019. Archivado desde el original el 24 de septiembre de 2019.
  6. Funciones en JavaScript (HTML). Documentos web de MDN . Red de desarrolladores de Mozilla. Consultado el 27 de septiembre de 2019. Archivado desde el original el 3 de septiembre de 2019.
  7. ECMAScript . Un lenguaje de programación multiplataforma de propósito general  (inglés) (PDF) . Archivo mozilla.org P. 63-64 . Suiza, CH-1204 Ginebra, 114 Rue du Rhone: ECMA (junio de 1997) .  — Especificación del estándar ECMAScript (ECMA-262). Primera edición Consultado el 27 de septiembre de 2019. Archivado desde el original el 27 de septiembre de 2019.
  8. Función (HTML). Documentos web de MDN . Red de desarrolladores de Mozilla. — Descripción del objeto Function y del constructor Function para la creación dinámica de funciones Fecha de acceso: 27 de septiembre de 2019. Archivado el 23 de septiembre de 2019.
  9. Documentación de Mathematica: Función (&) Archivado el 5 de abril de 2008.
  10. Función (&) . Wolfram Language & System - Centro de documentación . Wolframio. Consultado el 28 de septiembre de 2019. Archivado desde el original el 1 de octubre de 2019.
  11. perldoc perlref Archivado el 2 de enero de 2018 en Wayback Machine . 
  12. PHP Digest #152 (11-25 de marzo de 2019) . Consultado el 7 de mayo de 2019. Archivado desde el original el 7 de mayo de 2019.
  13. M. Zandstra, "Objetos PHP, patrones y práctica", segunda edición, ed. Prensa, 2008.
  14. Manual PHP . Fecha de acceso: 1 de mayo de 2010. Archivado desde el original el 16 de febrero de 2013.
  15. Manual PHP . Consultado el 1 de mayo de 2010. Archivado desde el original el 10 de agosto de 2011.
  16. Simplificación de la manipulación de datos en PowerShell con funciones Lambda . Consultado el 27 de septiembre de 2019. Archivado desde el original el 27 de septiembre de 2019.
  17. Sección del tutorial "Domina Python en 24 horas por tu cuenta" Archivado el 30 de abril de 2006.
  18. Descripción en Programación Ruby Archivado el 11 de abril de 2006.  (Inglés)