¿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.