syntax - programacion - signos de puntuacion
Historia de la coma final en las gramáticas del lenguaje de programación. (4)
Muchos lenguajes de programación permiten comas finales en su gramática después del último elemento de una lista. Supuestamente esto se hizo para simplificar la generación automática de código, lo cual es comprensible.
A modo de ejemplo, lo siguiente es una inicialización de matriz perfectamente legal en Java ( JLS 10.6 Array Inicializadores ):
int[] a = { 1, 2, 3, };
Tengo curiosidad si alguien sabe qué idioma fue el primero en permitir comas como este. Aparentemente C lo tenía desde 1985 .
Además, si alguien conoce otras "peculiaridades" gramaticales de los lenguajes de programación modernos, también me interesaría escucharlas. Leí que Perl y Python, por ejemplo, son incluso más liberales al permitir comas en otras partes de su gramática.
[¿Alguien sabe] otras "peculiaridades" gramaticales de los lenguajes de programación modernos?
Uno de mis favoritos, Modula-3 , fue diseñado en 1990 con la bendición de Niklaus Wirth como el último lenguaje de la "familia Pascal". ¿Alguien más recuerda esas terribles peleas acerca de donde el punto y coma debe ser un separador o un terminador ? En Modula-3, la elección es tuya! El EBNF para una secuencia de declaraciones es
stmt ::= BEGIN [stmt {; stmt} [;]] END
De manera similar, al escribir alternativas en una sentencia CASE
, Modula-3 le permite usar la barra vertical |
como un separador o un prefijo. Para que pudieras escribir
CASE c OF
| ''a'', ''e'', ''i'', ''o'', ''u'' => RETURN Char.Vowel
| ''y'' => RETURN Char.Semivowel
ELSE RETURN Char.Consonant
END
o puede omitir la barra inicial, tal vez porque prefiere escribir OF
en esa posición.
Creo que lo que me gustó tanto como el diseño en sí fue la conciencia de los diseñadores de que había una guerra religiosa y su persistencia en encontrar una manera de apoyar a ambas partes. ¡Que el programador elija!
PS Objective Caml permite el uso permisivo de |
en las expresiones de caso, mientras que el dialecto anterior y estrechamente relacionado, el Estándar ML no lo hace. Como resultado, las expresiones de casos suelen ser más feas en el código ML estándar.
EDITAR : Después de ver la respuesta de TED, revisé la gramática de Modula-2 y está en lo correcto, Modula-2 también admitió el punto y coma como terminador, pero a través del dispositivo de la declaración vacía, lo que hace que cosas como
x := x + 1;;;;;; RETURN x
legal. Supongo que eso no es algo malo. Modula-2 no permitió un uso flexible del separador de cajas |
, sin embargo; Eso parece haberse originado con Modula-3.
Acabo de descubrir que un compilador -fugly-comma
Fortran tiene el -fugly-comma
Ugly Null Arguments de la -fugly-comma
, aunque es un poco diferente (y como su nombre lo indica, bastante feo).
La opción
-fugly-comma
permite el uso de una sola coma al final para significar "pasar un argumento nulo al final" en una lista de argumentos reales a un procedimiento externo, y el uso de una lista vacía de argumentos para dicho procedimiento significa "pasar un solo argumento nulo ”.Por ejemplo,
CALL FOO(,)
significa "pasar dos argumentos nulos", en lugar de "pasar un argumento nulo". Además,CALL BAR()
significa "pasar un argumento nulo".
Sin embargo, no estoy seguro de en qué versión del idioma apareció por primera vez.
Algo que siempre me ha irritado con respecto a C es que, aunque permite una coma final adicional en una lista de intializer , no permite una coma final adicional en una lista de enumeradores (para definir los literales de un tipo de enumeración). Esta pequeña inconsistencia me ha mordido el culo más veces de las que puedo admitir. ¡Y sin ninguna razón!
No soy un experto en comas, pero sé que el estándar Pascal era muy perspicaz con respecto a que los puntos y coma fueran separadores de enunciados, no terminadores . Eso significaba que tenías que tener mucho cuidado con el lugar donde colocabas uno si no querías que el compilador te gritara.
Más tarde, los idiomas de Pascal-esque (C, Modula-2, Ada, etc.) tenían sus estándares escritos para aceptar el punto y coma extra extraño sin comportarse como si hubieras orinado en la mezcla del pastel.