# Gobstones

Gobstones es un lenguaje de programación diseñado para la enseñanza de ideas básicas de programación. Fue utilizado por primera vez en una materia de Introducción a la Programación de la Universidad Nacional de Quilmes en el año 2009. Se diferencia de otros lenguajes dedicados a tal fin, como puede ser Logo, debido a varias características. La más importante es que busca orientar al programador a un pensamiento denotacional (el "qué" de los programas), en lugar del tradicional pensamiento operacional (el "cómo" o secuencia de instrucciones). Otra de esas características es que el pasaje de este lenguaje a otros utilizados en la industria resulta más sencillo, pues posee conceptos fundamentales comunes a todos los lenguajes (pero con una separación mucho más clara que en ellos), y por la utilización de una sintaxis similar a la de estos. La sintaxis del lenguaje fue diseñada para ser similar a lenguajes como C y Java (posee bloques de código encerrados por llaves, definiciones de procedimientos y funciones, parámetros por valor, variables exclusivamente locales, etc.).
Su primera implementación fue hecha en el lenguaje Haskell, denominada sencillamente GOBSTONES, para ser usado en el intérprete Hugs a través de comandos de línea, y los resultados se visualizaban exclusivamente en ASCII. Actualmente existen implementaciones en otros lenguajes como Python (denominada PyGobstones) y C++. PyGobstones implementa un ambiente de desarrollo integrado para Gobstones, proveyendo edición del programa, validación de sintaxis, edición de tableros y algunas otras características adicionales. Es la única herramienta que se encuentra activa en su desarrollo.
Su nombre proviene del juego del mismo nombre proveniente de la historia de Harry Potter (cf. http://es.harrypotter.wikia.com/wiki/Gobstones), puesto que en las bolitas son parte fundamental de su universo de discurso.

## Universo de Discurso del Lenguaje

Gobstones posee tipos primitivos que intentan ser intuitivos, pertenecientes a un universo de discurso diseñado especialmente para este lenguaje. El componente más notable es el tablero, es una cuadrícula de celdas dispuestas en filas y columnas. Cada celda es un contenedor en el que puede haber bolitas de colores. En la versión actual, existen bolitas de cuatro colores: Azul, Negro, Rojo y Verde.
El tablero que posee un elemento activo, denominado "cabezal", que apunta en todo momento a una celda del mismo. El cabezal puede realizar diversas acciones( siempre sobre una única celda por vez), tales como poner y sacar bolitas de diferentes colores, moverse a otras celdas del tablero y otras. Si el cabezal se mueve a una celda no existente o intenta sacar bolitas de una celda vacía, el programa finaliza de forma anormal.
El lenguaje además posee una diferenciación clara entre comandos y expresiones puras. Los comandos describen acciones que realiza el cabezal sobre el tablero, y por lo tanto generan efectos. Las expresiones se limitan solo a denotar valores (no poseen efectos laterales). El usuario puede definir procedimientos (que dan nombre a comandos nuevos) y funciones puras.
El lenguaje no posee entrada y salida de datos. Al final de la ejecución de un programa Gobstones se visualiza un tablero final que resulta de los efectos descritos en el programa. Esta es una forma de no favorecer el pensamiento operacional, ya que no es sencillo ir viendo los estados intermedios, y así se minimiza la posibilidad de programación por "prueba y error".

## Sintaxis y comandos

* Se utiliza la palabra reservada, program, encerrado entre llaves ({ y } )
* La secuenciación de comandos se obtiene colocando los mismos uno a continuación del otro, normalmente en líneas separadas, y opcionalmente terminados con el carácter de punto y coma (;). Tablero de Gobstones de 3x3 con 5 bolitas Rojas ya insertadas.
Comandos:
* Poner(<color>): indica al cabezal que coloque una bolita del color <color> en la celda actual. Los valores posibles para <color> son los ya indicados: Verde, Rojo, Azul y Negro.
* Sacar(<color>): indica al cabezal que quite una bolita del color <color> en la celda actual, si hay alguna. Cuando el cabezal recibe una orden que no puede ejecutar, toma la acción drástica de autodestruirse, y con el al tablero y todas las bolitas.
* Mover(<dir>): indica al cabezal que debe moverse una celda en la dirección <dir>, si es posible. Las direcciones posibles (los valores que puede tomar <dir>) son Norte, Sur, Este y Oeste.
* IrAlBorde(<dir>): mueve el cabezal al borde indicado del tablero, en la misma fila y o columna.
* VaciarTablero: elimina todas las bolitas del tablero.