• Publicidad

Perl 6, oficialmente en beta

Novedades y noticias acerca de todo lo relacionado a Perl.

Perl 6, oficialmente en beta

Notapor explorer » 2015-09-28 09:50 @451

Este domingo pasado, cumpleaños de Larry Wall, marca el inicio del periodo beta del próximo Perl 6.

Ya empiezan a salir códigos que muestran la potencia y belleza de este lenguaje:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub postfix:<²>($a) { $a ** 2 };
  2.  
  3. say 2² +;   # 20
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub infix:<>($a, $b) { "$a LOVES Perl $b" };
  2.  
  3. say 'Zoffix''Perl 6';        # Zoffix LOVES Perl Perl 6
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14054
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Perl 6, oficialmente en beta

Notapor pierrot » 2015-09-28 12:20 @555

¡Excelente!

Aún no he leído mucho sobre Perl 6, pero voy a permitirme compartir otro ejemplo que había probado hace como un mes, y que me parece muy interesante.

Es bien sabido que el lenguaje formal { a^n b^n : n >=1 } = { ab, aabb, aaabbb, aaaabbbb, ... } es un lenguaje NO regular, o sea, que no existe una expresión regular que lo represente (esto se prueba utilizando un teorema llamado Lema de bombeo para lenguajes regulares). En términos de programación, esto equivale a que NO existe una expresión regular que coincida exclusivamente con las cadenas de este lenguaje (esto podría no ser cierto en el caso de Perl 5, pues la expresividad de las regexps de Perl 5 excede a la de las regexps concebidas como objeto matemático). Por ejemplo, la expresión regular

/a+b+/

ciertamente coincide con todas las cadenas de la forma a^n b^n pero además coincide con cadenas como "abbb" que no tienen la misma cantidad de letras "a" que de letras "b". Por eso en la teoría de lenguajes formales, existen las gramáticas formales, que extienden la potencia de las expresiones regulares. Una gramática G para el lenguaje anterior está dada por las reglas: S -> aSb | ab.

Perl 6 brinda soporte incluído en su núcleo para definir gramáticas :D

Y, como se puede ver en el siguiente ejemplo, la "traducción" a Perl 6 de la gramática anterior es casi inmediata:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. grammar G {
  2.     regex S { a<S>b | ab } # equivalentemente, regex S { a<S>?b }. lo escribí de forma "extendida" para que se note el parecido con S -> aSb | ab
  3. }
  4. say so G.parse( "", rule => 'S');        # False
  5. say so G.parse( "ab", rule => 'S');      # True
  6. say so G.parse( "aabb", rule => 'S');    # True
  7. say so G.parse( "aaabbb", rule => 'S');  # True
  8. say so G.parse( "aaabbbb", rule => 'S'); # False
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
Última edición por pierrot el 2015-09-30 18:38 @818, editado 4 veces en total
Avatar de Usuario
pierrot
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-08 12:53 @579

Re: Perl 6, oficialmente en beta

Notapor explorer » 2015-09-29 15:17 @679

Una expresión en Perl5 que es capaz de localizar esas cadenas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2.  
  3. my @tests = qw(
  4.     ab
  5.     aabb
  6.     aaabbb
  7.     aaaabbbb
  8.     aabbbb
  9.     abb
  10.     b
  11.     aaaaaabb
  12. );
  13.  
  14. foreach (@tests) {
  15.  
  16.     if (/^ (a+) (??{ "b" x length $1 }) $/x) {          # (??{}) es un patrón que contiene código Perl, que genera otro patrón
  17.         print "sí";
  18.     }
  19.     else {
  20.         print "no";
  21.     }
  22.     print " $_\n";
  23. }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14054
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl 6, oficialmente en beta

Notapor pierrot » 2015-09-30 11:36 @525

explorer escribiste:Una expresión en Perl5 que es capaz de localizar esas cadenas:

¡Bien! Yo había intentado algo similar (también embebiendo código Perl dentro de la expresión regular). Por eso hice la aclaración:
pierrot escribiste:(esto podría no ser cierto en el caso de Perl 5, pues la expresividad de las regexps de Perl 5 excede a la de las regexps concebidas como objeto matemático).

Otra feature o característica de las regexps de Perl que no es precisamente regular, es el de las backreferences. Por ejemplo, el lenguaje { w w | w en { 0, 1 }* } es claramente NO regular, y sin embargo la regexp de Perl 5,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. /\A ([01]*)\1 \z/x
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

es capaz de "localizar" estas cadenas.

Sin embargo, en el caso de otros lenguajes no regulares que son igualmente simples, por ejemplo, {a^n b^m : n, m >= 1, m > n}, empiezan a notarse las limitaciones de las expresiones regulares. Si pensamos utilizar (??{...}) como en tu solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. /^ (a+) (??{ "b" x length $1 }) $/x
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


en este caso no sabemos exactamente cuántas letras 'b' van después de las 'a' (sabemos que son una cantidad mayor a la de las 'a', pero desconocemos el número exacto). Con una gramática sigue siendo natural:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. grammar G {
  2.     regex TOP { a<TOP>b | abb+ }
  3. }
  4.  
  5. for <abb aaa abbb aaaabbbbb aabb> -> $cadena {
  6.     say ((so G.parse($cadena)) ?? "SI" !! "NO") ~ ": $cadena";
  7. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


La gramática formal para este lenguaje sería la dada por las reglas: S -> aSb | abB, B -> bB | b. Como sabemos que la regla de B genera cadenas de la forma b+, podemos (en Perl 6) escribir directamente S -> aSb | abb+ y ahorrarnos la definición de la regla para B. No he leído mucho sobre las gramáticas en Perl 6, pero son como unas gramáticas libres de contexto (o sea, solo una variable del lado izquierdo de las reglas) y del lado derecho se aceptan nombres de variables y ¡expresiones regulares en vez de terminales!
Última edición por pierrot el 2015-09-30 20:16 @886, editado 1 vez en total
Avatar de Usuario
pierrot
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-08 12:53 @579

Re: Perl 6, oficialmente en beta

Notapor explorer » 2015-09-30 14:17 @636

Es obvio que las exp. reg. en Perl 6, y sobre todo, las gramáticas, van a dar mucho juego. Yo estoy impaciente por meterles mano.

De momento, para Perl 5, la exp. reg. para el segundo lenguaje que has publicado, se puede resolver así (una posible forma):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.20;
  3.  
  4. my $regex = qr/^ (a+) (??{ 'b{' . (1+length $1) . ',}' }) $/x;
  5. say $regex;
  6.  
  7. for (qw(abb aaa abbb aaaabbbbb aabb)) {
  8.     say +(/$regex/ ? "SI" : "NO") . ": $_";
  9. }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14054
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl 6, oficialmente en beta

Notapor pierrot » 2015-09-30 18:49 @826

explorer escribiste:De momento, para Perl 5, la exp. reg. para el segundo lenguaje que has publicado, se puede resolver así (una posible forma):

Tienes razón; todavía se puede hacer medianamente simple. Escribí mi mensaje anterior justo antes de tomar un ómnibus y mientras subía se me ocurrió esta otra:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $re = qr/^ (a+) (??{ "b" x length $1 }) b+ $/x;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Es casi idéntica a la primera tuya añadiendo un b+ al final.

Cuando tenga tiempo, voy a pensar un lenguaje simple (así como éstos), para el que realmente sea muy complicado encontrar una expresión regular en Perl 5 y que en cambio, con gramáticas sea muy fácil generarlo (sin considerar ejemplos complejos, como por ejemplo, que sus cadenas sean texto HTML o un programa válido dada la especificación EBNF de un lenguaje de programación, en que resulta evidente que son necesarias gramáticas más que expresiones regulares).
Avatar de Usuario
pierrot
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-08 12:53 @579

Re: Perl 6, oficialmente en beta

Notapor pierrot » 2015-10-28 10:39 @485

Peteris Krumins, el autor de Perl One-Liners: 130 Programs That Get Things Done, en su blog tiene una entrada sobre expresiones regulares "recursivas", donde aporta otra expresión regular posible para {a^n b^n : n>=1}:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $re = qr/a(??{$re})?b/;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


:D
Avatar de Usuario
pierrot
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-08 12:53 @579


Volver a Noticias de Perl

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado