"Incompatible" resultado del partido utilizando bloque de código en regex [Raku]

Jakar:

Mientras que el registro y prueba de diversos aspectos de expresiones regulares, me topé con un comportamiento "incosistent" extraño y. Yo estaba tratando de usar algo de código en una expresión regular, pero el mismo comportamiento se aplica también con el uso de un bloque de código vacío. Sobre todo lo que me movió más, fue la diferencia en el resultado del partido cuando intercambia el: g frente a los modificadores: x.

Los siguientes fragmentos de código representan el comportamiento "incompatibles".

Primero sin el bloque de código:

use v6.d;

if "test1 test2 test3 test4" ~~ m:g/ (\w+) / {
    say ~$_ for $/.list;
}

Resultado:

test1
test2
test3
test4

luego con la: g modificador y el bloque de código:

use v6.d;

if "test1 test2 test3 test4" ~~ m:g/ (\w+) {} / {
    say ~$_ for $/.list;
}

Resultado:

test4

y finalmente con la: x modificador y el bloque de código

use v6.d;

if "test1 test2 test3 test4" ~~ m:x(4)/ (\w+) {} / {
    say ~$_ for $/.list;
}

Resultado:

test1
test2
test3
test4

Esperaba que las tres resultados a ser el mismo pero me sorprendió negativamente.

¿Hay alguna explicación acerca de este comportamiento?

rafe:

(Reescrito después de más pruebas y la espeleología código).

Esto me parece (y es de suponer que) como un insecto. $/de alguna manera está consiguiendo kiboshed cuando se utiliza :gy un bloque integrado.

Esta respuesta portadas:

  • Reducción a cero en el problema

  • En cuanto a código fuente del compilador

  • Buscando colas de emisión y / o la presentación de una nueva emisión

Reducción a cero en el problema

my &debug = {;} # start off doing no debugging
$_ = 'aa';

say       m      / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
say $/ if m      / {debug 1} 'a' {debug 2} /; debug 3; # 「a」

say       m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
say $/ if m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)

say       m:g    / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
say $/ if m:g    / {debug 1} 'a' {debug 2} /; debug 3; # 「a」 <--- Uhoh

Ahora que debugdigamos algo útil y ejecutar el primer par (sin adverbio expresiones regulares):

&debug = { say $_, $/.WHICH } # Say location of object bound to `$/`

say       m      / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
# 1Match|66118928
# 2Match|66118928
# 「a」
# 3Match|66118928

say $/ if m      / {debug 1} 'a' {debug 2} /; debug 3; # 「a」
# 1Match|66119072
# 2Match|66119072
# 「a」
# 3Match|66119072

El mismo resultado simple en ambos casos. El proceso de emparejamiento crea un Matchobjeto y se pega con la misma.

Ahora las dos variaciones con el :x(2)adverbio:

say       m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66119936
# 2Match|66119936
# 1Match|66120080
# 2Match|66120080
# 1Match|66120224
# (「a」 「a」)
# 3List|67612624

say $/ if m:x(2) / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66120368
# 2Match|66120368
# 1Match|66120512
# 2Match|66120512
# 1Match|66120656
# (「a」 「a」)
# 3List|67612672

Esta vez el proceso de partido crea un Matchobjeto y se pega con él durante una pasada, a continuación, un segundo objeto partido para un segundo pase, y finalmente un tercer objeto partido para un tercer pase antes de que falle para que coincida con una tercera 'a'(y por tanto el correspondiente debug 2doesn' t ser llamado). Al final de la m.../.../llamada se ha creado un Listobjeto y obligado que a $/.

A continuación se corre el primero de los dos :gcasos:

say       m:g    / {debug 1} 'a' {debug 2} /; debug 3; # (「a」 「a」)
# 1Match|66119216
# 2Match|66119216
# 1Match|66119360
# 2Match|66119360
# 1Match|66119504
# (「a」 「a」)
# 3Match|66119504

Al igual que el x:(2)caso, se intenta por tercera vez y fallamos. Pero el proceso de concordancia que no devuelve ningún Listpero en lugar de un Matchobjeto. Y es el creado en el tercer pase. (Lo que me sorprende.)

Por último, está el caso "Uhoh":

say $/ if m:g    / {debug 1} 'a' {debug 2} /; debug 3; # 「a」 <--- Uhoh
# 1Match|66119648
# 2Match|66119648
# 1Match|66119792
# 2Match|66119792
# 「a」
# 3Match|66119792

Sorprendentemente, el tercer paso se espera no parece comenzar.

En cuanto a código fuente del compilador

Es plausible que explorar el código fuente pertinente sería valiosa. Voy a escribir sobre eso aquí en caso de que sea de su interés o de otros lectores y en caso de que esto es un error, y lo que escribo es de interés para alguien arreglarlo.

AFAICT un bloque de código en unos cables de expresiones regulares a un nodo de AST que se genera aquí que inserta un delante sub-nodo de los estados en el bloque que hace una operación de enlace:

                    :op('bind'),

                    QAST::Var.new( :name('$/'), :scope('lexical') ),

                    QAST::Op.new(
                        QAST::Var.new( :name('$¢'), :scope('lexical') ),
                        :name('MATCH'),
                        :op('callmethod')
                    )

Mi lectura de lo anterior es que se inserta código que se une al léxico $/símbolo para el resultado de una .MATCHllamada a un método en el objeto unido al léxico símbolo inmediatamente antes de ejecutar el código en el bloque.

El doc tiene una sección sobre ; Voy a citar una sentencia:

La principal diferencia entre $/y es alcance: este último sólo tiene un interior valor [a] regex

Me quedo preguntando por qué existe y qué otras diferencias existen.

Hacia adelante...

Veo que hay un nivel de raku.MATCH . Pero apenas se hace nada. Así que supongo que el código que es relevante es aquí .

En este punto voy a hacer una pausa. Podría seguir aún más en una edición posterior.

Buscando colas de emisión y / o la presentación de una nueva emisión

Si alguien se le ocurre una respuesta en los próximos días, lo que demuestra que lo que has demostrado no es un error, o que ya se ha presentado como un error, a continuación, justo lo suficiente.

De lo contrario, por favor considere hacer su propia búsqueda de las colas de emisión y / o iniciar un nuevo tema en cualquier cola de emisión se considera el más apropiado (por defecto a / rakudo / rakudo / problemas).

Ya he buscado en las cuatro colas de emisión github.com yo consideraba plausible como parte relevante de escribir esta respuesta:

Busqué dos palabras clave que esperaba puede descubrir un problema existente ( "global" y "publicar"). No hay problemas de concordancia fueron relevantes. Tal vez también puede buscar otras palabras clave que usted piensa que un contribuyente puede utilizar.

Si presenta un problema, por favor, considerar la adición de sus pruebas, o la mía o alguna otra variante, convertidos en los casos de prueba estándar asado, si sabes cómo hacerlo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=370068&siteId=1
Recomendado
Clasificación