Página 1 de 1

Perl 6, oficialmente en beta

NotaPublicado: 2015-09-28 09:50 @451
por explorer
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.003 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.001 segundos, usando GeSHi 1.0.8.4

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-09-28 12:20 @555
por pierrot
¡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.001 segundos, usando GeSHi 1.0.8.4

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-09-29 15:17 @679
por explorer
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.001 segundos, usando GeSHi 1.0.8.4

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-09-30 11:36 @525
por pierrot
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.001 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.001 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.001 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!

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-09-30 14:17 @636
por explorer
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.001 segundos, usando GeSHi 1.0.8.4

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-09-30 18:49 @826
por pierrot
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.001 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).

Re: Perl 6, oficialmente en beta

NotaPublicado: 2015-10-28 10:39 @485
por pierrot
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.001 segundos, usando GeSHi 1.0.8.4


:D