2012-03-28 19 views
11

En cuanto a una gramática OCaml no oficial en this site la única producción en la que aparece begin es:es begin..end in OCaml azúcar sintáctica?

Expression ::= begin Expression end 

y un poco de uno abajo más ve:

Expression ::= ( Expression [:Type] ) 

Eso, junto con algunos reemplazos mano torpe de begin/end con (/) en un código trivial (que no afectó la corrección) puede parecer que sugiere que la palabra clave begin s son solo azúcar sintáctico. ¿O me estoy perdiendo algo?

Respuesta

27

"Azúcar sintáctico" sugiere una traducción simple pero no trivial a otras construcciones. begin .. end no es azúcar sintáctica, es redundante con (..), porque hace exactamente lo mismo.

Si está interesado, la intención es que los programadores puedan usar begin .. end para encerrar una expresión imperativa, ejecutada por sus efectos secundarios, y (..) para una expresión con un valor que no sea unitario. Pero el compilador no hace cumplir eso, los diseñadores del lenguaje pensaron que se vería mejor si se usaran de esta manera, eso es todo.

+3

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

+5

@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. ** –

+0

@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. –

9

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

+1

pedante significa preciso, con una fuerte connotación de _muy precisa_. Tu respuesta fue IMO precisa. –

Cuestiones relacionadas