reservadas palabras lenguaje caracteristicas perl functional-programming

palabras - ¿Qué características de Perl lo convierten en un lenguaje de programación funcional?



palabras reservadas de perl (2)

Cosas útiles que son relevantes:

Los monjes perl despotrican sobre la programación funcional.

Perl de orden superior

C2.com definiciones de programación funcional

Funciones de primera clase

En informática, se dice que un lenguaje de programación tiene funciones de primera clase si trata a las funciones como ciudadanos de primera clase. Específicamente, esto significa que el lenguaje admite funciones de paso como argumentos a otras funciones, devolviéndolos como valores de otras funciones y asignándolos a variables o almacenándolos en estructuras de datos.

Así que en Perl:

my $print_something = sub { print "Something/n" }; sub do_something { my ($function) = @_; $function->(); } do_something($print_something);

Veredicto: apoyado de forma nativa

Funciones de orden superior

En matemáticas y ciencias de la computación, una función de orden superior (también forma funcional, funcional o funtor) es una función que realiza al menos uno de los siguientes:

  • toma una o más funciones como entrada

  • genera una función

Con referencia a este post en perlmonks :

En la terminología de Perl, a menudo nos referimos a ellos como devoluciones de llamada, fábricas y funciones que devuelven referencias de código (generalmente cierres).

Veredicto: apoyado de forma nativa

http://www.perl.com/pub/2002/05/29/closure.html

Dentro de las preguntas frecuentes de perl tenemos preguntas sobre What is a closure? :

Closure es un término informático con un significado preciso pero difícil de explicar. Generalmente, los cierres se implementan en Perl como subrutinas anónimas con referencias duraderas a variables léxicas fuera de sus propios ámbitos. Estos léxicos se refieren mágicamente a las variables que existían cuando se definió la subrutina (vinculación profunda).

Los cierres se utilizan con mayor frecuencia en lenguajes de programación en los que puede tener el valor de retorno de una función como una función, al igual que en Perl.

Esto se explica tal vez un poco más claramente en el artículo: http://www.perl.com/pub/2002/05/29/closure.html

sub make_hello_printer { my $message = "Hello, world!"; return sub { print $message; } } my $print_hello = make_hello_printer(); $print_hello->()

Veredicto: apoyado de forma nativa

La coincidencia de patrones

En el contexto de los lenguajes funcionales puros y de esta página, la Coincidencia de patrones es un mecanismo de envío: elegir la variante de una función es la correcta a llamar. Inspirado en las notaciones matemáticas estándar.

Las tablas de despacho son la aproximación más cercana, esencialmente un hash de subs anónimos o refs de código.

use strict; use warnings; sub do_it { print join( ":", @_ ); } my $dispatch = { ''onething'' => sub { print @_; }, ''another_thing'' => /&do_it, }; $dispatch->{''onething''}->("fish");

Como es just un hash, también puede agregar referencias de código y subrutinas anónimas. (Nota: no es totalmente diferente de la programación orientada a objetos)

Veredicto: Solución

Asignación única

Cualquier asignación que cambie un valor existente (por ejemplo, x: = x + 1) no está permitida en lenguajes puramente funcionales. 4 En la programación funcional, la asignación se desaconseja en favor de la asignación única, también llamada inicialización. La asignación individual es un ejemplo de enlace de nombre y difiere de la asignación como se describe en este artículo en que solo se puede realizar una vez, generalmente cuando se crea la variable; no se permite ninguna reasignación posterior.

No estoy seguro de que perl realmente haga esto. La aproximación más cercana podría ser referencias / subs anónimas o quizás constant .

Veredicto: no es compatible

Evaluación perezosa

Esperar hasta el último momento posible para evaluar una expresión, especialmente con el fin de optimizar un algoritmo que no utilice el valor de la expresión.

¿Ejemplos de técnicas de evaluación perezosas en Perl 5?

Y nuevamente, volviendo a Higher Order Perl (no estoy afiliado a este libro, honestamente, parece ser uno de los textos clave sobre el tema).

El concepto central aquí parece ser: cree una ''lista enlazada'' en perl (utilizando técnicas orientadas a objetos), pero incruste una referencia de código en su ''marcador final'' que evalúa si alguna vez llega tan lejos.

Veredicto: Solución

Recolección de basura

"GarbageCollection (GC), también conocida como administración de memoria automática, es el reciclaje automático de la memoria del montón".

Perl hace esto a través del recuento de referencias y liberando cosas cuando ya no están referenciadas. Tenga en cuenta que esto puede tener implicaciones para ciertas cosas que es más probable que encuentre en la programación funcional.

Específicamente - referencias circulares que están cubiertas en perldoc perlref

Veredicto: apoyo nativo

Inferencia de tipos

TypeInference es el análisis de un programa para inferir los tipos de algunas o todas las expresiones, generalmente en CompileTime

Perl implícitamente arroja valores de un lado a otro según sea necesario. Por lo general, esto funciona lo suficientemente bien como para que no necesites meterte con él. En ocasiones, debe "forzar" el proceso realizando una operación numérica o de cadena explícita. Canónicamente, esto es ya sea agregando 0, o concatenando una cadena vacía.

Puedes sobrecargar un escalar para hacer cosas diferentes usando dualvars

Veredicto: apoyo nativo

Optimización de llamadas de cola

La optimización de la llamada de cola (o la fusión de la llamada de la cola o la eliminación de la llamada de la cola) es una generalización de TailRecursion: si lo último que hace una rutina antes de que se devuelva es llamar a otra rutina, en lugar de hacer un marco de salto-y-agregar-apilar inmediatamente seguido por un pop-stack-frame-and-return-to-caller, debería ser seguro simplemente saltar al comienzo de la segunda rutina, permitiéndole reutilizar el marco de pila de la primera rutina (entorno).

¿Por qué Perl tiene tanto miedo de la "recursión profunda"?

Funcionará, pero le avisará si su profundidad de recursión es> 100. Puedes deshabilitar esto agregando:

no warnings ''recursion'';

Pero obviamente, debe ser un poco cauteloso con la profundidad de la recursión y la huella de la memoria.

Por lo que puedo decir, no hay ninguna optimización en particular y si desea hacer algo como esto de una manera eficiente, es posible que deba desenrollar (efectivamente) sus recursivos e iterar.

Las llamadas posteriores son compatibles con perl. O vea la notación goto, o vea la sintaxis más completa para él proporcionada por Sub::Call::Tail

Veredicto: Nativo

Lista de Comprensiones

Las comprensiones de listas son una característica de muchos lenguajes modernos de programación funcional. Sujeto a ciertas reglas, ¿proporcionan una notación sucinta para GeneratingElements? en una lista Una lista de comprensión es SyntacticSugar para una combinación de aplicaciones de las funciones concat, map y filter

Perl tiene map , grep , reduce .

También hace frente a la expansión de rangos y repeticiones:

my @letters = ( "a" .. "z" );

Así que puedes:

my %letters = map { $_ => 1 } ( "A" .. "z" );

Veredicto: Nativo ( List::Utils es un módulo central)

Efectos monádicos

... no, todavía tengo problemas con estos. Es mucho más simple o mucho más complejo de lo que puedo asimilar.

Si alguien tiene algo más, agregue o edite esta publicación o ... algo. Todavía soy un vago en algunos de los conceptos involucrados, por lo que esta publicación es más un punto de partida.

Inspirado un poco por: https://stackoverflow.com/questions/30977789/why-is-c-not-a-functional-programming-language

He encontrado: Perl Orden Superior

Me hizo preguntarme sobre la afirmación de que Perl es un lenguaje de programación funcional. Ahora, aprecio que la programación funcional es una técnica (muy parecida a la orientación a objetos).

Sin embargo, he encontrado una lista de lo que hace un lenguaje de programación funcional :

  • Funciones de primera clase
  • Funciones de orden superior
  • Cierres Lexicos
  • La coincidencia de patrones
  • Asignación única
  • Evaluación perezosa
  • Recolección de basura
  • Inferencia de tipos
  • Optimización de llamadas de cola
  • Lista de Comprensiones
  • Efectos monádicos

Ahora algunos de estos estoy bastante familiarizado con:

La recolección de basura, por ejemplo, es el conteo de referencias de Perl y la liberación de memoria cuando ya no es necesario.

Los cierres léxicos son incluso parte de las preguntas frecuentes: ¿Qué es un cierre? - probablemente haya un mejor artículo aquí: http://www.perl.com/pub/2002/05/29/closure.html

Pero empiezo a mostrarme un poco confuso en algunas de estas: enumeración de listas, por ejemplo, creo que se refiere a map / grep ( List::Util and reduce ?)

¿Alguien me puede ayudar a llenar los espacios aquí? ¿Cuál de las anteriores puede hacer Perl fácilmente (y hay un ejemplo fácil) y hay ejemplos en los que cae?


Muy buen tema, quería escribir un artículo titulado algo sobre "el camello es funcional". Déjame contribuir con algún código.

Perl también soporta este anónimo funciones como

sub check_config { my ( $class, $obj ) = @_; my $separator = '' > ''; # Build message from class namespace. my $message = join $separator, ( split ''::'', $class ); # Use provided object $obj or # create an instance of class with defaults, provided by configuration. my $object = $obj || $class->new; # Return a Function. return sub { my $attribute = shift; # Compare attribute with configuration, # just to ensure it is read from there. is $object->config->{$attribute}, # Call attribute accessor so it is read from config, # and validated by type checking. $object->$attribute, # Build message with attribute. join $separator, ( $message, $attribute ); } } sub check_config_attributes { my ( $class, $obj ) = @_; return sub { my $attributes = shift; check_config( $class, $obj )->($_) for (@$attributes); } }