De hecho, hay varios usos de paréntesis en la gramática OCaml para diferentes reglas gramaticales, y no todos se pueden usar con begin..end. Paréntesis y begin..end se pueden usar como delimitadores de expresión libre de semántica para propósitos de desambiguación (como dijiste, expr ::= '(' expr ')'
). ()
también representa la constante del tipo unit
y, como un juego de palabras, begin end
también está permitido allí, pero este último no se especifica en el manual, solo consistentemente es compatible con la implementación.
Pero paréntesis, también se pueden utilizar
- para delimitar patrones:
function (_::_)::_ -> ...
- como el azúcar sintáctica para
Array.get
y Array.set
: t.(i)
t.(i) <- e
- de anotaciones de tipo
(e : t)
tanto en las expresiones y los patrones (esto es no un caso especial de los delimitadores de desambiguación porque no es válido sin paréntesis)
- para coacciones de subtipificación:
(e :> t)
y (e : s :> t)
- para formar compuestos de patrones marcados:
fun ~(x:int) ..
y fun ?(x=10) ..
- en diversos lugares relacionados (coacciones, anotaciones, etc.) en el módulo, la firma y la clase/objetos partes de la sintaxis
para ninguno de este uso puede utilizarse begin..end lugar, por lo que definitivamente no sería válida para reemplazar (
con begin
y )
con end
sistemática (mientras que lo contrario es correcto).
Disculpa la pedante respuesta, pero la pregunta en sí misma era bastante precisa. No estoy seguro de comenzar ...el manejo final es la parte más elegante de la gramática OCaml (que tiene muchas verrugas). Uno podría desear que realmente fueran equivalentes, pero entonces no tiene mucho sentido insistir en escribir begin x : int end
en lugar de (x : int)
.
¿Quién dice que el azúcar sintáctico tiene que ser no trivial? ¿Qué significa eso, de todos modos? Definitivamente clasificaría el comienzo como fibra sintáctica. –
@AndreasRossberg Si el compilador OCaml traducía 'begin .. end' to' (..) 'internamente, el primero sería azúcar sintáctico. El compilador no hace esto en ningún sentido significativo. En cambio, ambas construcciones están codificadas implícitamente en la construcción de la AST. ** Uno no se traduce al otro. ** –
@AndreasRossberg Sé sobre las diferencias culturales y todo eso, pero sus comentarios me parecen poco productivos. Dado que está comentando que no está de acuerdo, ¿podría tratar de explicar su punto de vista un poco mejor que, por ejemplo, "¿Por qué dice que no puede compilar por separado el código nativo en Ocaml? Por supuesto que puede."? No debería, en ese caso particular, tener que decirle que siga el enlace que ya he proporcionado o que repita lo que allí se dice. –