gobstones / gobstones-interpreter

[GobstonesWeb] The compiler for Gobstones language (wrongly named)
GNU General Public License v3.0
0 stars 4 forks source link

Incorporación de varios cambios #34

Closed foones closed 6 years ago

foones commented 6 years ago

Se incorporan varios cambios con dos breaking changes.


Se modificó el tipo enumerado Event, y en particular los nombres de las teclas.

Breaking change: Se modificaron los nombres de algunas teclas. K_ENTER pasa a ser K_RETURN. K_{LEFT|RIGHT|UP|DOWN}_ARROW pasan a ser K_{LEFT|RIGHT|UP|DOWN}. Los paréntesis, corchetes y llaves pasan a ser K_{LEFT|RIGHT}{PAREN|BRACKET|BRACE}.

Además se agregaron nuevas teclas para números (K_0, ..., K_9), símbolos (K_ASTERISK, K_EXCLAIM, etc.) y teclas de función. La lista completa está en la documentación https://github.com/gobstones/gobstones-interpreter/blob/master/doc/gobstones.tex.

A falta de un estándar (que yo conozca) se sigue la nomenclatura de la biblioteca SDL.


Se deshabilitó la recursión sintáctica. Si hay un ciclo en el grafo de invocaciones de funciones y procedimientos, el programa se rechaza al momento de hacer el análisis semántico (antes de iniciar la ejecución).

Para permitir la recursión sintáctica, se puede usar el pragma /*@LANGUAGE@AllowRecursion@*/.


Se introdujo un cambio en la semántica para que el tipo de una variable x no sea el tipo del valor actualmente almacenado en x sino el máximo de los tipos de todos los valores históricamente almacenados en x.

Este cambio tiene la intención de subsanar una anomalía sutil.

Dando un poco de contexto, el siguiente programa:

x := 1
x := True

ocasiona un error en tiempo de ejecución porque al momento de efectuar una asignación se verifica que el tipo del nuevo valor que toma la variable sea compatible con el tipo del valor que tenía anteriormente. (En este caso, Number y Bool no son tipos compatibles).

La anomalía es que en la versión anterior del lenguaje el siguiente programa:

x := [1]
x := []
x := [True]

no ocasionaba un error en tiempo de ejecución porque el tipo de [1] es List(Number), que es compatible con el tipo de [] que es List(*), y este a su vez es compatible con el tipo de [True] que es List(Bool).

Con el cambio incorporado, la variable x mantiene registro no solamente de su valor sino también del máximo (join) de sus tipos históricos, de manera que después de efectuar la asignación x := [] el tipo de x sigue siendo List(Number), provocando que x := [True] falle.


Breaking change: Se cambió el nombre de la función ultimo a último.

Se agregó la función faltante que determina si una lista está vacía. Su versión en castellano se llama vacía pero está sujeta a cambios.


Se modificó en la que se muestran los tipos estructurales (registros y variantes) tratando de que la notación resulte más legible y natural. Para ello no se especifica la presencia de constructores que no reciben parámetros. Por ejemplo con el siguiente registro:

type T is variant {
  case A {}
  case B {}
  case C { field x }
  case D { field y }
}

En la versión anterior:

En la versión actual:


Se prohibió la sintaxis return (). Para devolver una tupla vacía hay que usar la sintaxis return (()).

Nota: este cambio hace que el lenguaje sea menos regular/ortogonal, pero se espera que capture el error potencialmente común de olvidarse de completar el valor de retorno en una función en el contexto de materias introductorias.