Raku es un miembro de la familia de lenguajes de programación Perl . [6] Anteriormente conocido como Perl 6 , se renombró en octubre de 2019. [7] [8] Raku introduce elementos de muchos lenguajes modernos e históricos. La compatibilidad con Perl no era un objetivo, aunque un modo de compatibilidad es parte de la especificación. El proceso de diseño de Raku comenzó en 2000.
Paradigma | Multi-paradigma |
---|---|
Familia | Perl |
Diseñada por | Larry Wall |
Desarrollador | Comunidad Raku |
Apareció por primera vez | 25 de diciembre de 2015 |
Lanzamiento estable | 6.d "Diwali" [2] / 24 de octubre de 2020 |
Disciplina de mecanografía | Dinámico , gradual |
SO | Multiplataforma |
Licencia | Licencia pública general GNU o licencia artística 2 |
Extensiones de nombre de archivo | .p6, .pm6, .pod6, .t6, .raku, .rakumod, .rakudoc, .rakutest [3] |
Sitio web | raku |
Implementaciones importantes | |
Rakudo | |
Influenciado por | |
Perl , Ruby , Smalltalk , Haskell , [4] JavaScript | |
Influenciado | |
Perl , [5] Haskell , [5] AntLang |
Historia
En Perl 6, decidimos que sería mejor arreglar el idioma que arreglar al usuario.
- Larry Wall [9]
El proceso de diseño de Raku fue anunciado por primera vez el 19 de julio de 2000, el cuarto día de la Conferencia Perl de ese año , [10] por Larry Wall en su charla State of the Onion 2000 . [11] En ese momento, los objetivos principales eran eliminar las "verrugas históricas" del idioma; "las cosas fáciles deberían seguir siendo fáciles, las cosas difíciles deberían volverse más fáciles y las cosas imposibles deberían volverse difíciles"; una limpieza general del diseño interno y las API . El proceso comenzó con una serie de solicitudes de comentarios o "RFC". Este proceso estuvo abierto a todos los colaboradores y no dejó ningún aspecto del lenguaje cerrado al cambio. [12]
Una vez que se completó el proceso de RFC, Wall revisó y clasificó cada solicitud (se recibieron 361). Luego comenzó el proceso de escribir varios "Apocalipsis", un término que significa "revelador". [13] Si bien el objetivo original era escribir un Apocalipsis para cada capítulo de Programming Perl , se hizo obvio que, a medida que se escribía cada Apocalipsis, los Apocalipsis anteriores estaban siendo invalidados por cambios posteriores. Por este motivo, se publicó una serie de Sinopsis, cada una de las cuales relata el contenido de un Apocalipsis, pero con los cambios posteriores reflejados en actualizaciones. Hoy en día, la especificación Raku se gestiona a través de la suite de pruebas "tostada", [14] mientras que las sinopsis se mantienen como referencia histórica. [15]
También hay una serie de exégesis escritas por Damian Conway que explican el contenido de cada Apocalipsis en términos de uso práctico. Cada exégesis consta de ejemplos de código junto con una discusión del uso y las implicaciones de los ejemplos. [dieciséis]
Hay tres métodos principales de comunicación utilizados en el desarrollo de Raku en la actualidad. El primero es el canal raku IRC en Libera Chat . El segundo es un conjunto de listas de correo en los servidores de la Fundación Perl en perl.org . [17] El tercero es el repositorio de código fuente de Git alojado en https://github.com/raku .
Objetivos e implicaciones iniciales
El principal objetivo que Wall sugirió en su discurso inicial fue la eliminación de las verrugas históricas. Estos incluyeron la confusión que rodea al uso del sigilo para los contenedores, la ambigüedad entre las select
funciones y el impacto sintáctico de los identificadores de archivos de palabras sin formato. Había muchos otros problemas que los programadores de Perl habían discutido solucionar durante años y que Wall abordó explícitamente en su discurso. [ cita requerida ]
Una implicación de estos objetivos fue que Perl 6 no tendría compatibilidad hacia atrás con la base de código de Perl existente. Esto significaba que un compilador de Perl 6 no aceptaría parte del código que fue interpretado correctamente por un compilador de Perl 5. Dado que la compatibilidad con versiones anteriores es un objetivo común al mejorar el software, los cambios importantes en Perl 6 debían indicarse explícitamente. La distinción entre Perl 5 y Perl 6 se hizo tan grande que finalmente Perl 6 pasó a llamarse Raku.
A lo largo de los años, Raku ha sufrido varias alteraciones en su dirección. La introducción de conceptos de Python y Ruby fueron influencias tempranas [ cita requerida ] . Además, dado que Pugs, el primer intérprete capaz de ejecutar Raku, estaba escrito en el lenguaje de programación Haskell , el equipo de diseño de Raku absorbió muchas influencias de programación funcional . [ cita requerida ]
Mascota
La mascota del idioma es "Camelia, el insecto Raku". [1] Su nombre es un guiño a la mascota del camello asociada con Perl , y su forma, en la tradición amante de los juegos de palabras de la comunidad de Perl, es un juego de " error de software ". Los diseños en espiral incrustados en sus alas de mariposa se asemejan a los personajes "P6", el apodo favorito de Perl 6, y la colocación de los ojos descentrados es un juego de palabras intencional con "Wall-eyed". [18]
Uno de los objetivos detrás del diseño vivo y colorido del logo era desalentar la misoginia en la comunidad y que fuera una oportunidad para que los de "persuasión masculina" mostraran su lado sensible. [19]
Implementaciones
A partir de 2017[actualizar], solo la implementación de Rakudo está en desarrollo activo. Ninguna implementación será designada como implementación oficial de Raku; más bien, "Raku es cualquier cosa que pase la suite de pruebas oficial". [20]
Rakudo Perl 6 [21] [22] apunta a una serie de máquinas virtuales, como MoarVM , Java Virtual Machine y JavaScript . MoarVM es una máquina virtual construida especialmente para Rakudo [23] y NQP Compiler Toolchain. [24] Hay una capa entre Raku y las máquinas virtuales llamada Not Quite Perl 6, o NQP, que implementa las reglas de Raku para analizar Raku, así como un árbol de sintaxis abstracto y generación de código específico del backend . Grandes porciones de Rakudo están escritas en Raku mismo, o en su subconjunto NQP. Rakudo no es una implementación completamente autohospedada , ni hay planes concretos en este momento para hacer de Rakudo un compilador de arranque.
Implementaciones históricas
Pugs fue una implementación inicial de Perl 6 escrita en Haskell . Los pugs solían ser la implementación más avanzada de Perl 6, pero desde mediados de 2007 está en su mayor parte inactiva (con actualizaciones realizadas solo para rastrear la versión actual de GHC ). En noviembre de 2014, Pugs no se mantenía activamente. [25]
En 2007, v6-MiniPerl6 ("mp6") y su reimplementación, v6-KindaPerl6 ("kp6") se escribieron como un medio para arrancar el Perl-6.0.0 STD, usando Perl 5. El STD es una gramática completa para Perl 6 y está escrito en Perl 6. En teoría, cualquier cosa capaz de analizar el STD y generar código ejecutable es un sistema de arranque adecuado para Perl 6. kp6 actualmente está compilado por mp6 y puede funcionar con múltiples backends. [26] [27] mp6 y kp6 no son implementaciones completas de Perl 6 y están diseñadas solo para implementar el conjunto de características mínimo requerido para arrancar un compilador completo de Perl 6.
Yapsi era un compilador de Perl 6 y un tiempo de ejecución escrito en Perl 6. Como resultado, necesitaba un intérprete de Perl 6 existente, como una de las versiones de Rakudo Star, para funcionar. [28]
Niecza, otro importante esfuerzo de implementación de Perl 6, se centró en la optimización y la investigación de implementación eficiente. Se dirige a la infraestructura del lenguaje común . [29]
Sistema de módulos
La especificación Raku solicita que los módulos se identifiquen por nombre, versión y autoridad. [30] Es posible cargar solo una versión específica de un módulo, o incluso dos módulos del mismo nombre que difieren en versión o autoridad. Para su comodidad, se proporciona un alias a un nombre corto.
CPAN , el sistema de distribución de módulos de Perl, aún no maneja módulos Raku. En su lugar, se utiliza un sistema de módulo prototipo. [31]
Cambios importantes de Perl
Perl y Raku difieren fundamentalmente, aunque en general la intención ha sido "mantener Raku Perl", por lo que Raku es claramente "un lenguaje de programación Perl". La mayoría de los cambios están destinados a normalizar el lenguaje, para que sea más fácil de entender para los programadores novatos y expertos, y para hacer que "las cosas fáciles sean más fáciles y las difíciles más posibles".
Una especificación
Una gran diferencia no técnica entre Perl y Raku es que Raku comenzó como una especificación. [20] Esto significa que Raku se puede volver a implementar si es necesario, y también significa que los programadores no tienen que leer el código fuente para tener la autoridad máxima sobre una característica determinada. La documentación oficial no se considera autorizada y solo describe el comportamiento del intérprete de Perl real de manera informal. Cualquier discrepancia encontrada entre la documentación y la implementación puede llevar a que se cambie para reflejar la otra, una dinámica que impulsa el desarrollo continuo y el refinamiento de las versiones de Perl.
Un sistema de tipos
En Raku, el sistema de tipos dinámicos de Perl se ha aumentado mediante la adición de tipos estáticos . [32] Por ejemplo:
mi Int $ i = 0 ;mi Rata $ r = 3,142 ;my Str $ s = "Hola, mundo" ;
Sin embargo, la escritura estática sigue siendo opcional , por lo que los programadores pueden hacer la mayoría de las cosas sin ninguna escritura explícita:
my $ i = "25" + 10 ; # $ i tiene 35
Raku ofrece un sistema de escritura gradual , mediante el cual el programador puede optar por usar escritura estática, usar escritura dinámica o mezclar los dos.
Listas formales de parámetros de subrutinas
Perl define subrutinas sin listas de parámetros formales en absoluto (aunque se puede realizar un conteo de parámetros simple y una verificación de tipo muy flexible usando los "prototipos" de Perl). Los argumentos de subrutina pasados se alias en los elementos de la matriz @_ . Si se modifican los elementos de @_ , los cambios se reflejan en los datos originales.
Raku introduce verdaderos parámetros formales al lenguaje. [33] En Raku, una declaración de subrutina se ve así:
sub do_something ( Str $ cosa , Int $ otro ) { ...}
Como en Perl, los parámetros formales (es decir, las variables en la lista de parámetros) son alias de los parámetros reales (los valores pasados), pero por defecto, los alias son constantes por lo que no se pueden modificar. Pueden declararse explícitamente como alias de lectura y escritura para el valor original o como copias utilizando las directivas is rw
o is copy
respectivamente si el programador requiere que se modifiquen localmente.
Modos de paso de parámetros
Raku proporciona tres modos básicos de transmisión de parámetros: parámetros posicionales, parámetros con nombre y parámetros slurpy.
Los parámetros posicionales son la típica lista ordenada de parámetros que utilizan la mayoría de los lenguajes de programación. Todos los parámetros también pueden pasarse utilizando su nombre de forma desordenada. Los parámetros de solo nombre (indicados por un :
antes del nombre del parámetro) solo se pueden pasar especificando su nombre, es decir, nunca captura un argumento posicional. Los parámetros Slurpy (indicados por un *
antes del nombre del parámetro) son la herramienta de Raku para crear funciones variadas . Un hash slurpy capturará los parámetros restantes pasados por nombre, mientras que una matriz slurpy capturará los parámetros pasados por posición restantes.
A continuación, se muestra un ejemplo del uso de los tres modos de paso de parámetros:
sub algunaFuncion ( $ a , $ b ,: $ c ,: $ d , * @e ) { ...}algunaFuncion ( 1 , 2 ,: d ( 3 ), 4 , 5 , 6 ); # $ a = 1, $ b = 2, $ d = 3, @ e = (4,5,6)
Los parámetros posicionales, como los utilizados anteriormente, siempre son obligatorios a menos que estén seguidos de ?
para indicar que son opcionales. Los parámetros con nombre son opcionales de forma predeterminada, pero se pueden marcar como necesarios añadiendo !
después del nombre de la variable. Los parámetros slurpy son siempre opcionales.
Bloques y cierres
Los parámetros también se pueden pasar a bloques arbitrarios, que actúan como cierres . Así es como, por ejemplo, for
y while
se nombran los iteradores de bucle. En el siguiente ejemplo, se recorre una lista, 3 elementos a la vez, y se pasa al bloque de bucle como las variables, $a, $b, $c
. [34]
para @list -> $ a , $ b , $ c { ...}
Esto generalmente se denomina "subprograma puntiagudo" o "bloque puntiagudo", y la flecha se comporta casi exactamente como la sub
palabra clave, introduciendo un cierre anónimo (o subrutina anónima en la terminología de Perl). [33]
Invariancia del sigilo
En Perl, los sigilos , los caracteres de puntuación que preceden al nombre de una variable, cambian dependiendo de cómo se use la variable:
# Código Perlmi @ matriz = ('a', 'b', 'c');mi $ elemento = $ matriz [1]; # $ elemento es igual a 'b',my @extract = @ array [1, 2]; # @extract es igual a ('b', 'c')mi $ elemento = @ matriz [1]; # 'b' viene con una advertencia (opción 5.10)
En Raku, los sigilos son invariantes, lo que significa que no cambian en función de si se necesita la matriz o el elemento de la matriz: [32]
# Código Rakumi @ matriz = 'a', 'b', 'c';mi $ elemento = @ matriz [1]; # $ elemento es igual a 'b'my @extract = @ array [1]; # @extract es igual a ('b')my @extract = @ array [1, 2]; # @extract es igual a ('b', 'c')
La variación en Perl se inspira en la concordancia numérica en inglés y en muchos otros idiomas naturales:
" Esta manzana". # $ a CORRECTO" Estas manzanas". # @a CORRECTO" Esta tercera manzana". # $ a [3] CORRECTO" Esta tercera manzana". # @a [3] INCORRECTO
Sin embargo, este mapeo conceptual se rompe cuando entran en juego las referencias, ya que pueden referirse a estructuras de datos aunque sean escalares. Por lo tanto, tratar con estructuras de datos anidadas puede requerir una expresión tanto en singular como en plural en un solo término:
# Código Perl: recupera una lista de la hoja de un hash que contiene hashes que contienen matrices my @trans_verbs = @ { $ dictionary { 'verb' } { 'transitive' } };
Esta complejidad no tiene equivalente ni en el uso común del lenguaje natural ni en otros lenguajes de programación, [ dudoso ] y provoca una alta carga cognitiva al escribir código para manipular estructuras de datos complejas. Este es el mismo código en Raku:
# Código Raku: recupera una lista de la hoja de un hash que contiene hashes que contienen matrices my @trans_verbs = % dictionary <> ;
Programación orientada a objetos
Perl admite la programación orientada a objetos a través de un mecanismo conocido como bendición . Cualquier referencia puede ser bendecida para convertirse en un objeto de una clase particular. Un objeto bendecido puede tener métodos invocados usando la "sintaxis de flecha" que hará que Perl localice o "envíe" una subrutina apropiada por su nombre, y la llame con la variable bendecida como su primer argumento.
Si bien es extremadamente poderoso, hace que el caso más común de orientación a objetos, un objeto similar a una estructura con algún código asociado, sea innecesariamente difícil. Además, debido a que Perl no puede hacer suposiciones sobre el modelo de objetos en uso, la invocación del método no se puede optimizar muy bien.
Con el espíritu de hacer "las cosas fáciles fáciles y las difíciles posibles", Raku conserva el modelo de bendición y proporciona un modelo de objeto más robusto para los casos comunes. [35] Por ejemplo, una clase para encapsular un punto cartesiano podría definirse y usarse de esta manera:
el punto de clase es rw { tiene $ .x ; tiene $ .y ; método distancia ( Punto $ p ) { sqrt (( $! x - $ p . x ) ** 2 + ( $! y - $ p . y ) ** 2 ) } método distancia al centro { self . distancia: Punto . nuevo ( x => 0 , y => 0 ) }}my $ point = Point . nuevo ( x => 1,2 , y => - 3,7 );diga "Ubicación del punto: (" , $ punto . x , ',' , $ punto . y , ')' ;# SALIDA: Ubicación del punto: (1.2, -3.7)# Cambiar xey (observe los métodos "x" e "y" usados como valores l): $ punto . x = 3 ;$ punto . y = 4 ;diga "Ubicación del punto: (" , $ punto . x , ',' , $ punto . y , ')' ;# SALIDA: Ubicación del punto: (3, 4)my $ otro-punto = Punto . nuevo ( x => - 5 , y => 10 );$ punto . distancia ( $ otro punto ); # => 10 $ punto . distancia al centro ; # => 5
El punto reemplaza la flecha en un guiño a los muchos otros lenguajes (por ejemplo, C ++ , Java , Python , etc.) que se han unido alrededor del punto como sintaxis para la invocación del método.
En la terminología de Raku, $.x
se denomina "atributo". Algunos idiomas llaman a estos campos o miembros . El método utilizado para acceder a un atributo se denomina "accesor". Un método de acceso automático es un método creado automáticamente y nombrado después del nombre del atributo, como el método x
en el ejemplo anterior. Estas funciones de acceso devuelven el valor del atributo. Cuando una clase o atributo individual se declara con el is rw
modificador (abreviatura de "lectura / escritura"), se puede pasar un nuevo valor a los accesos automáticos para establecer el atributo, o se puede asignar directamente como un valor l (como en el ejemplo). Los accesos automáticos pueden ser reemplazados por métodos definidos por el usuario, si el programador desea una interfaz más rica para un atributo. Solo se puede acceder a los atributos directamente desde una definición de clase a través de la $!
sintaxis, independientemente de cómo se declaren los atributos. Todos los demás accesos deben pasar por los métodos de acceso.
El sistema de objetos Raku ha inspirado el marco Moose que presenta muchas de las características de OOP de Raku en Perl. [ aclaración necesaria ]
Herencia, roles y clases
La herencia es la técnica mediante la cual un objeto o tipo puede reutilizar código o definiciones de objetos o tipos existentes. Por ejemplo, un programador puede querer tener un tipo estándar pero con un atributo adicional. La herencia en otros lenguajes, como Java, se proporciona al permitir que las clases sean subclases de las clases existentes.
Raku proporciona herencia a través de clases, que son similares a las clases en otros idiomas, y roles.
Los roles en Raku asumen la función de interfaces en Java , mixins en Ruby y traits [36] en PHP y en la variante Smalltalk Squeak . Se parecen mucho a las clases, pero proporcionan un mecanismo de composición más seguro. [37] Estos se utilizan para realizar la composición cuando se utilizan con clases en lugar de agregar a su cadena de herencia . Los roles definen tipos nominales; proporcionan nombres semánticos para colecciones de comportamiento y estado. La diferencia fundamental entre un rol y una clase es que las clases se pueden instanciar; los roles no lo son. [38]
Aunque los roles son distintos de las clases, es posible escribir código Raku que instancia directamente un rol o utiliza un rol como un objeto de tipo, Raku creará automáticamente una clase con el mismo nombre que el rol, lo que permitirá utilizar un rol de forma transparente. como si fuera una clase. [39]
Básicamente, un rol es un conjunto de métodos y atributos (posiblemente abstractos) que se pueden agregar a una clase sin usar la herencia. Incluso se puede agregar un rol a un objeto individual; en este caso, Raku creará una subclase anónima, agregará el rol a la subclase y cambiará la clase del objeto a la subclase anónima.
Por ejemplo, un perro es un mamífero porque los perros heredan ciertas características de los mamíferos, como las glándulas mamarias y (a través del padre del mamífero, Vertebrado ) una columna vertebral . Por otro lado, los perros también pueden tener uno de varios tipos distintos de comportamiento, y estos comportamientos pueden cambiar con el tiempo. Por ejemplo, un perro puede ser una mascota , un vagabundo (una mascota abandonada adquirirá comportamientos para sobrevivir no asociados a una mascota) o un guía para ciegos (los perros guía están entrenados, por lo que no comienzan su vida como perros guía). . Sin embargo, estos son conjuntos de comportamientos adicionales que se pueden agregar a un perro. También es posible describir estos comportamientos de tal manera que se puedan aplicar de manera útil a otros animales, por ejemplo, un gato puede ser igualmente una mascota o un callejero. Por lo tanto, el perro y el gato son distintos entre sí, mientras que ambos permanecen dentro de la categoría más general de mamíferos. Entonces, Mammal es una clase y Perro y Gato son clases que heredan de Mammal. Pero los comportamientos asociados con Pet, Stray y Guide son roles que se pueden agregar a clases u objetos instanciados de clases.
class Mammal is Vertebrate { ...}class Dog is Mammal { ...}rol Mascota { ...}role Stray { ...} guía de roles { ...}
Los roles se agregan a una clase u objeto con la does
palabra clave. Para mostrar la herencia de una clase, hay una palabra clave diferente is
. Las palabras clave reflejan los diferentes significados de las dos características: la composición del rol le da a una clase el comportamiento del rol, pero no indica que sea realmente lo mismo que el rol.
class GuideDog is Dog does Guide { ...} # La subclase compone el rolmi $ perro = nuevo perro ;$ perro hace Guía ; # El objeto individual compone el rol
Aunque los roles son distintos de las clases, ambos son tipos, por lo que un rol puede aparecer en una declaración de variable donde normalmente se colocaría una clase. Por ejemplo, un rol ciego para un humano podría incluir un atributo de tipo Guía; este atributo podría contener un perro guía, un caballo guía , un humano guía o incluso una máquina guía.
clase Humano { tiene Perro $ perro ; # Puede contener cualquier tipo de perro, tenga la función de ... # Guía o no}role Blind { tiene Guide $ guide ; # Puede contener cualquier objeto que desempeñe la función de guía, ... # ya sea un perro o cualquier otra cosa}
Expresiones regulares
El soporte de procesamiento de cadenas y expresiones regulares de Perl siempre ha sido una de sus características definitorias. [40] Dado que las construcciones de coincidencia de patrones de Perl han excedido las capacidades de las expresiones del lenguaje regular durante algún tiempo, [41] la documentación de Raku se referirá exclusivamente a ellas como expresiones regulares , distanciando el término de la definición formal.
Raku proporciona un superconjunto de características de Perl con respecto a las expresiones regulares, plegándolas en un marco más grande llamado " reglas " que brindan las capacidades de formalismos de análisis sensibles al contexto (como los predicados sintácticos de análisis de gramáticas de expresión y ANTLR ), además de actuar como cierre con respecto a su alcance léxico . [42] Las reglas se introducen con la palabra clave que tiene un uso bastante similar a la definición de subrutina. Las reglas anónimas también se pueden introducir con la palabra clave (o ), o simplemente se pueden usar en línea como las expresiones regulares estaban en Perl a través de los operadores (coincidencia) o (sustituto).rule
regex
rx
m
s
En Apocalipsis 5 , Larry Wall enumeró 20 problemas con la "cultura actual de expresiones regulares". Entre ellos se encontraban que las expresiones regulares de Perl eran "demasiado compactas y 'lindas'", tenían "demasiada confianza en muy pocos metacaracteres", "poco soporte para capturas con nombre", "poco soporte para gramáticas" y "pobre integración con 'real' idioma". [43]
Simplificación sintáctica
Algunas construcciones de Perl se han cambiado en Raku, optimizadas para diferentes señales sintácticas para los casos más comunes. Por ejemplo, los paréntesis ( corchetes ) requeridos en las construcciones de flujo de control en Perl ahora son opcionales: [34]
if is-true () { para @array { ... }}
Además, el ,
operador (coma) ahora es un constructor de listas, por lo que ya no es necesario incluir paréntesis en las listas. El código
@array = 1 , 2 , 3 , 4 ;
ahora hace @array
una matriz con exactamente los elementos '1', '2', '3' y '4'.
Comparaciones encadenadas
Raku permite comparaciones "encadenadas". Es decir, se permite una secuencia de comparaciones como la siguiente:
si 20 <= $ temperatura <= 25 { diga "¡La temperatura ambiente está entre 20 y 25!"}
Esto se trata como si cada comparación de izquierda a derecha se realizara por sí sola y el resultado se combinara lógicamente a través de la and
operación.
Evaluación perezosa
Raku usa la técnica de evaluación perezosa de listas que ha sido una característica de algunos lenguajes de programación funcional como Haskell : [44]
@ enteros = 0 .. Inf ; # enteros de 0 a infinito
El código anterior no se bloqueará al intentar asignar una lista de tamaño infinito a la matriz @integers
, ni se bloqueará indefinidamente al intentar expandir la lista si se busca un número limitado de espacios.
Esto simplifica muchas tareas comunes en Raku, incluidas las operaciones de entrada / salida, las transformaciones de listas y el paso de parámetros.
Recolectar
Relacionado con la evaluación perezosa está la construcción de listas perezosas usando gather
y take
, comportándose como generadores en lenguajes como Icon o Python .
mis $ cuadrados = recolección perezosa para 0 .. Inf { tomar $ _ * $ _ ; };
$squares
será una lista infinita de números cuadrados, pero la evaluación perezosa gather
asegura que los elementos solo se computen cuando se accede a ellos.
Uniones
Raku introduce el concepto de uniones : valores que son compuestos de otros valores. [44] En su forma más simple, las uniones se crean combinando un conjunto de valores con operadores de unión :
# Ejemplo de | ("cualquiera") Cruce: my $ color = 'white' ;a menos que $ color eq 'blanco' | 'negro' | 'gris' | 'gray' { die "No se admite la impresión en color \ n" ;}# Ejemplo de cruce & ("all"): my $ password = 'secret! 123' ;if $ password ~~ / <: alpha> / & / <: digit> / & / <: punct> / { say "Tu contraseña es razonablemente segura" ;}
|
indica un valor que es igual a sus argumentos de la izquierda o de la derecha. &
indica un valor que es igual a sus argumentos izquierdo y derecho. Estos valores se pueden utilizar en cualquier código que utilice un valor normal. Las operaciones realizadas en una unión actúan sobre todos los miembros de la unión por igual y se combinan de acuerdo con el operador de la unión. Entonces, ("apple"|"banana") ~ "s"
cedería "apples"|"bananas"
. En las comparaciones, las uniones devuelven un único resultado verdadero o falso para la comparación. " any
" Las uniones devuelven verdadero si la comparación es verdadera para cualquiera de los elementos de la unión. " all
" Las uniones devuelven verdadero si la comparación es verdadera para todos los elementos de la unión.
Las uniones también se pueden utilizar para aumentar de forma más rica el sistema de tipos al introducir un estilo de programación genérica que se limita a las uniones de tipos:
subconjunto Color de Any donde RGB_Color | CMYK_Color ;sub get_tint ( Color $ color , Num $ opacity ) { ...}
Macros
En los lenguajes de bajo nivel, el concepto de macros se ha convertido en sinónimo de sustitución textual del código fuente debido al uso generalizado del preprocesador C . Sin embargo, los lenguajes de alto nivel como Lisp eran anteriores a C en el uso de macros que eran mucho más poderosas. [45] Es este macro concepto similar a Lisp que Raku aprovechará. [33] El poder de este tipo de macro se deriva del hecho de que opera en el programa como una estructura de datos de alto nivel , en lugar de como un simple texto, y tiene todas las capacidades del lenguaje de programación a su disposición.
Una definición de macro Raku se verá como una subrutina o definición de método, y puede operar en cadenas sin analizar, un AST que representa código previamente analizado o una combinación de los dos. Una macrodefinición se vería así: [46]
macro hola ( $ qué ) { cuasi { di "Hola {{{{$ qué}}}}" };}
En este ejemplo particular, la macro no es más compleja que una sustitución textual de estilo C, pero debido a que el análisis del parámetro macro ocurre antes de que la macro opere en el código de llamada, los mensajes de diagnóstico serían mucho más informativos. Sin embargo, debido a que el cuerpo de una macro se ejecuta en el momento de la compilación cada vez que se utiliza, se pueden emplear muchas técnicas de optimización . Incluso es posible eliminar por completo cálculos complejos de los programas resultantes realizando el trabajo en tiempo de compilación.
Identificadores
En Perl, los nombres de los identificadores pueden utilizar caracteres alfanuméricos ASCII y guiones bajos también disponibles en otros idiomas. En Raku, los caracteres alfanuméricos pueden incluir la mayoría de los caracteres Unicode. Además, se pueden usar guiones y apóstrofos (con ciertas restricciones, como no ir seguidos de un dígito). El uso de guiones en lugar de guiones bajos para separar palabras en un nombre conduce a un estilo de denominación llamado " caso de kebab ".
Ejemplos de
Hola Mundo
El programa hello world es un programa común que se utiliza para introducir un idioma. En Raku, hola mundo es:
di 'Hola, mundo' ;
- aunque hay más de una forma de hacerlo .
Factorial
La función factorial en Raku, definida de diferentes formas:
# El uso de la repetición (con `si \ constructo else`) sub hecho ( UInt $ n -> UInt ) { si $ n == 0 { 1 } demás { $ n * hecho ( $ n-1 )}}# Usando recursividad (con `if` como modificador de declaración) sub fact ( UInt $ n -> UInt ) { return 1 if $ n == 0 ; return $ n * hecho ( $ n-1 );}# Usando recursividad (con `when` construct) sub fact ( UInt $ n -> UInt ) { when $ n == 0 { 1 } default { $ n * fact ( $ n-1 )}}# Usando el operador ternario sub hecho ( UInt $ n -> UInt ) { $ n == 0 ?? 1 !! $ n * hecho ( $ n-1 )}# Usando envío múltiple multi fact ( 0 ) { 1 } multi fact ( UInt $ n -> UInt ) { $ n * fact ( $ n - 1 )}# Usando el metaoperator reducción sub hecho ( UInt $ n -> UInt ) { [*] 1 .. $ n}# Creando un operador factorial y usando el sub sufijo del metaoperador de reducción : (UInt $ n -> UInt ) {[*] 1 .. $ n }# Uso de `declarador state` para crear un factorial memoized sub hecho ( UInt $ n -> UInt ) { estado % conocida = 0 => 1 ; devuelve % conocido { $ n } si % conocido { $ n }: existe ; % conocido { $ n } = $ n * hecho ( $ n-1 ); retorno % conocido { $ n };}
Ordenación rápida
Quicksort es un algoritmo de clasificación muy conocido. Una implementación de trabajo [a] que usa el paradigma de programación funcional se puede escribir sucintamente en Raku:
# La lista vacía se ordena a la lista vacía multi ordenamiento rápido ([]) {()}# De lo contrario, extraiga el primer elemento como pivote ... multi quicksort ([ $ pivot , * @rest ]) { # Partition. my @before = @rest . grep (* antes de $ pivot ); my @after = @rest . grep (* después de $ pivote ); # Ordene las particiones. flat ( ordenación rápida ( @antes ), $ pivote , ordenación rápida ( @después ))}
- ^ A menos que la implementación haga algo elegante y misterioso detrás de escena, la profundidad de recursividad máxima posible es la longitud de la lista, lo que hace que esta implementación no sea adecuada para big data. La profundidad de la recursividad se puede limitar
log2(list_length)
iterando en la partición más grandebefore
yafter
, y solo recurriendo a la partición más pequeña.
Torre de Hanoi
Tower of Hanoi se utiliza a menudo para introducir programación recursiva en informática. Esta implementación utiliza el mecanismo de envío múltiple de Raku y las restricciones paramétricas:
multi sub hanoi ( 0 , $, $, $) {} # Sin disco, así que no hagas nada multi sub hanoi ( $ n , $ a = 'A' , $ b = 'B' , $ c = 'C' ) { # Empiece con $ n discos y tres clavijas A, B, C hanoi $ n - 1 , $ a , $ c , $ b ; # Primero, mueva los discos $ n - 1 superiores de A a B, diga "Mueva el disco $ n de la clavija $ a a la clavija $ c" ; # luego mueva el último disco de A a C hanoi $ n - 1 , $ b , $ a , $ c ; # finalmente mueva $ n - 1 discos de B a C}
Libros
En la historia de Raku hubo dos oleadas de escritura de libros. La primera ola siguió al anuncio inicial de Perl 6 en 2000. Esos libros reflejan el estado del diseño del lenguaje de esa época y contienen en su mayoría material desactualizado. La segunda ola, que siguió al anuncio de la Versión 1.0 en 2015, incluye varios libros que ya se han publicado y algunos otros que están en proceso de redacción.
Libros publicados antes de la versión 1.0 de Perl 6 (conocida como versión 6.c)
- A. Randal, D. Sugalski, L. Totsch. Perl 6 y Parrot Essentials , 1.a edición, 2003, ISBN 978-0596004996
- A. Randal, D. Sugalski, L. Totsch. Perl 6 y Parrot Essentials , segunda edición 2004. ISBN 978-0596007379
- S. Walters. Perl 6 Now: Las ideas centrales ilustradas con Perl 5. 2004. ISBN 978-1590593950
Además, en 2009 se publicó un libro dedicado a una de las primeras máquinas virtuales de Perl 6, Parrot.
- A. Randal, A. Whitworth. Guía del desarrollador de Parrot: Pir. 2009. ISBN 978-0977920129
Libros publicados después de la versión 1.0 de Perl 6 (conocida como versión 6.c)
- Andrew Shitov. Perl 6 de un vistazo. 2017. ISBN 978-90-821568-3-6 - descargue el PDF oficial gratuito o descárguelo de GitHub
- Laurent Rosenfeld, Allen B. Downey. Piense en Perl 6 2017. ISBN 978-1-4919-8055-2
- Moritz Lenz. Perl 6 Fundamentos 2017. ISBN 978-1-4842-2898-2
- JJ Merelo. Aprender a programar con Perl 6: Primeros pasos: iniciarse en la programación sin salir de la línea de comandos 2017. ISBN 978-1521795781
- Andrew Shitov. Perl 6 Deep Dive . 2017. ISBN 978-1-78728-204-9
- Andrew Shitov. Usando Perl 6 . 2017. ISBN 978-90-821568-1-2 - descargue el PDF oficial gratuito o descárguelo de GitHub
- Moritz Lenz. Búsqueda y análisis con Perl 6 Regexes 2017. ISBN 978-1-4842-3228-6
- brian d foy . Aprendiendo Perl 6 2018 ISBN 978-1491977682
Libros publicados con el nuevo nombre Raku
- Andrew Shitov. Usando Raku , 2.a edición, 2019, ISBN 978-90-821568-8-1 - descargue el PDF oficial gratuito o descargue una copia de GitHub
- Andrew Shitov. Raku One-Liners , 2019, ISBN 978-90-821568-9-8 - descargue el PDF oficial gratuito o descárguelo de GitHub
Libros a publicar
Hay algunos informes [47] de diferentes autores sobre los nuevos libros que se publicarán próximamente, todos basados en la versión actual 1.0 (conocida como versión 6.c) de Perl 6.
- Andrew Shitov. Migración a Perl 6. Una transición sencilla desde Perl 5 . ISBN 978-90-821568-5-0 . Probablemente nunca se publique.
- Gabor Szabo. Desarrollo de aplicaciones web en Perl 6 .
Referencias
- ^ a b Jackson, Joab (23 de julio de 2010). "El creador de Perl insinúa el lanzamiento inminente del tan esperado Perl 6" . Servicio de noticias IDG . Consultado el 8 de febrero de 2015 .
- ^ http://blogs.perl.org/users/zoffix_znet/2018/11/announce-raku-perl-6-diwali-6d-language-specification-release.html
- ^ https://docs.raku.org/language/modules#Basic_structure
- ^ "Glosario de términos y jerga" . Perl Foundation Perl 6 Wiki . La Fundación Perl . 28 de febrero de 2011. Archivado desde el original el 21 de enero de 2012 . Consultado el 8 de febrero de 2015 .
- ^ a b 唐鳳, también conocida como Audrey Tang (21 de abril de 2010). "Cómo implementar Perl 6 en '10" .
- ^ "Acerca de Perl" . perl.org . Consultado el 11 de junio de 2020 .
"Perl" es una familia de lenguajes, "Raku" (anteriormente conocido como "Perl 6") es parte de la familia, pero es un lenguaje separado que tiene su propio equipo de desarrollo. Su existencia no tiene un impacto significativo en el desarrollo continuo de "Perl".
- ^ "Perl 6 renombrado a Raku" . LWN.net . 15 de octubre de 2019 . Consultado el 16 de octubre de 2019 .
- ^ "Respuesta de TPF al cambio de nombre de Raku" . 29 de octubre de 2019.
- ^ Federico Biancuzzi; Shane Warden (2009). Mentes maestras de la programación: conversaciones con los creadores de los principales lenguajes de programación . ISBN 978-0596515171.
- ^ Kline, Joe (21 de agosto de 2000). "Informe de la Conferencia de Perl" .
- ^ Pared, Larry (2000). "Estado de la cebolla 2000" . O'Reilly Network.
- ^ La Fundación Perl (2000). "Acerca de las RFC de Perl 6" .
- ^ Wall, Larry (2 de abril de 2001). "Apocalipsis 1: lo feo, lo malo y lo bueno" .
- ^ "Suite de prueba de Raku" . 2019.
- ^ Larry Wall y los diseñadores de Perl 6 (2015). "Documentos de diseño de Perl 6" .
- ^ La Fundación Perl (2001). "Exégesis" .
- ^ La Fundación Perl (2002). "Desarrollo de Perl: listas de correo" .
- ^ "Larry Wall en el registro de chat de IRC" . 15 de enero de 2016 . Consultado el 10 de noviembre de 2017 .
- ^ "Archivado" Consideraciones sobre el logotipo "correo electrónico de Larry Wall" . 24 de marzo de 2009 . Consultado el 10 de noviembre de 2017 .
- ^ a b Wall, Larry (10 de agosto de 2004). "Sinopsis 1: Resumen" .
- ^ "rakudo / rakudo - GitHub" . Github.com . Consultado el 21 de septiembre de 2013 .
- ^ Michaud, Patrick (16 de enero de 2008). "El compilador anteriormente conocido como 'perl6 ' " . Archivado desde el original el 18 de febrero de 2012.
- ^ Worthington, Jonathan. "MoarVM: una máquina virtual para NQP y Rakudo" . 6guts . Consultado el 24 de julio de 2013 .
- ^ "MoarVM" . Equipo de MoarVM . Consultado el 8 de julio de 2017 .
- ^ "Comparación de características de los compiladores de Perl 6" . Archivado desde el original el 7 de febrero de 2019.
- ^ Wall, Larry; et al. (2007). "Perl 6 STD" .
- ^ "Preguntas frecuentes sobre mp6 / kp6" . Equipo de desarrollo de Perl 6. 2006.
- ^ "Léame de Yapsi" . 2011.
- ^ O'Rear, Stefan (29 de noviembre de 2011). "Niecza README.pod" . Consultado el 12 de enero de 2012 .
- ^ Pared, Larry (2004). "Sinopsis 11: Módulos" .
- ^ "Directorio de módulos de Perl 6" . Modules.raku.org . Consultado el 17 de mayo de 2020 .
- ^ a b Wall, Larry (20 de mayo de 2009). "Sinopsis 2: Bits and Pieces" .
- ^ a b c Wall, Larry (21 de marzo de 2003). "Sinopsis 6: Subrutinas" .
- ^ a b Wall, Larry (20 de mayo de 2009). "Sinopsis 4: Bloques y declaraciones" .
- ^ Wall, Larry (18 de agosto de 2006). "Sinopsis 12: Objetos" .
- ^ El Grupo de Composición de Software (2003). "Rasgos" . Archivado desde el original el 11 de agosto de 2006 . Consultado el 22 de septiembre de 2006 .
- ^ Jonathan Worthington (2009). "Día 18: Roles" .
- ^ cromático (2009). "El por qué de los roles de Perl" .
- ^ "Orientación a objetos" . docs.raku.org . Consultado el 24 de octubre de 2019 .
- ^ Parlante, Nick (2000). "Perl esencial: procesamiento de cadenas con expresiones regulares" .
- ^ Christiansen, Tom (1996). "Descripción de expresión regular PERL5" . Archivado desde el original el 31 de marzo de 2010 . Consultado el 25 de marzo de 2010 .
Las expresiones regulares de Perl "no son", es decir, no son "regulares" porque las referencias inversas por sed y grep también son compatibles, lo que hace que el lenguaje ya no sea estrictamente regular.
- ^ Wall, Larry (20 de mayo de 2009). "Sinopsis 5: expresiones regulares y reglas" .
- ^ Wall, Larry (4 de junio de 2002). "Apocalipsis 5: Coincidencia de patrones" .
- ^ a b Wall, Larry (13 de septiembre de 2004). "Sinopsis 9: Estructuras de datos" .
- ^ Lamkins, David B. (8 de diciembre de 2004). Lisp exitoso: cómo comprender y utilizar Common Lisp . bookfix.com.
- ^ "Macros" .
- ^ Libros sobre Perl 6
enlaces externos
- Página web oficial