haskell syntax escaping lexer

¿Qué significa escapar y significa en haskell?



syntax escaping (1)

Miré el informe Haskell2010 y noté una secuencia de escape extraña con un símbolo comercial: /& . No pude encontrar una explicación de lo que esta secuencia de escape debería representar. También puede ser que sólo se encuentra en cadenas. Intenté print "/&" en GHCi e imprime una cadena vacía.


Se escapa ... no tiene carácter. Es útil para "romper" algunas secuencias de escape. Por ejemplo, podríamos expresar "/12" ++ "3" como un literal de una sola cadena. Si intentamos el enfoque obvio, obtenemos

"/123" ==> "{"

Sin embargo podemos usar

"/12/&3"

para el resultado previsto.

Además, "/SOH" y "/SO" son ambos escapes de caracteres ASCII únicos válidos, por lo que "/SO" ++ "H" difícil de expresar como un solo literal: necesitamos "/SO/&H" para eso.

Este truco de escape también es explotado por la instancia estándar Show String , que tiene que producir una sintaxis literal válida. Podemos ver esto en acción en GHCi:

> "/140" ++ "0" "/140/&0" > "/SO" ++ "H" "/SO/&H"

Además, esto ayuda enormemente a los programas externos que tienen como objetivo generar código Haskell (por ejemplo, para la metaprogramación). Al emitir caracteres para una cadena literal, el programa externo puede agregar /& al final de escapes potencialmente ambiguos (o incluso de todos los escapes) para que el programa no tenga que manejar interacciones no deseadas. Por ejemplo, si el programa quiere emitir /12 ahora, puede emitir /12/& y ser libre de emitir cualquier cosa como el siguiente carácter. De lo contrario, el programa debe recordar que, cuando se emite el siguiente carácter, debe ser precedido por /& si es un dígito. Siempre es más sencillo agregar /& , incluso si no es necesario: /12/&A es legal y tiene el mismo significado que /12A .

Finalmente, una cita del Informe Haskell, explicando /& :

2.6 Literales de caracteres y cuerdas

[...]

Consistente con la regla de "munch máxima", los caracteres de escape numéricos en cadenas constan de todos los dígitos consecutivos y pueden ser de longitud arbitraria. De manera similar, el código de escape ASCII ambiguo, "/SOH" , se analiza como una cadena de longitud 1. El carácter de escape /& se proporciona como un "null character" para permitir cadenas como "/137/&9" y "/SO/&H" para ser construido (ambos de longitud dos). Por lo tanto, "/&" es equivalente a "" y el carácter ''/&'' no está permitido. Otras equivalencias de caracteres se definen en la Sección 6.1.2.