8/4/15

Programando en Shakespeare






El lenguaje de programación Shakespeare (SPL) puede no ser el lenguaje más potente del mundo pero, sin duda, es divertido y original. Su sintaxis busca que el código que se escribe (que, obviamente, debe ser ejecutable) pueda ser leído también como si se tratara de una obra del autor inglés. Los programas, así, tienen un doble sentido de lectura, el nemotécnico que ordena al procesador efectuar ciertas operaciones y el analógico de lectura directa que simula una obra teatral. Fue diseñado por Jon Åslund y Karl Hasselström.
 
Como las variables que puede manejar sólo pueden representar números enteros, su potencial es limitado pero seguramente ni sus creadores ni los usuarios eligen Shakespeare por su potencia de cálculo.
 
¿Cómo se logra que el código parezca lenguaje natural? Simplemente sustituyendo las instrucciones habituales por palabras propias de las obras de Shakespeare. Las variables, asimismo, deben tomar  nombres de personajes  de las obras de Shakespeare ya que, si no, el compilador las rechazará.

Aunque el fin último es disponer de un compilador propio, en este momento Shakespeare se ejecuta en dos pasos. Primero, existe un intérprete que traduce SPL a C y, posteriormente, es el código C el que se compila.

 
Instrucciones principales 

Un tutorial completo del lenguaje puede leerse en este enlace. Aunque está fuera del alcance de este post el enseñar a programar en SPL, he aquí algunos de los conceptos principales.
 

title: todo programa debe comenzar con una instrucción de este tipo. En realidad, todo los escrito desde el inicio hasta el primer punto es un comentario que el compilador obviará. El título sirve sólo para identificar el programa sobre el papel pero no es ejecutable. Así, por ejemplo, estos dos casos son títulos. Es el punto final el que determina el final del título: 

Cálculo de una matriz inversa. 

Ordenación de nombres en

una base de datos determinada.

 
Dramatis Personae: es la sección donde se declaran las variables.  Cada variable puede sólo contener números enteros. Cada variable tiene el formato: 

Nombre, Descripción. 

El primer valor es el nombre de la variable (los nombres deben ser obligatoriamente personajes de las obras de Shakespeare ya que el compilador/ intérprete tiene una lista de ellos y no aceptará nombres que no sean los de la lista) y la descripción sirve sólo como comentario explicativo y será desechado por el compilador/intérprete.
 

Romeo, a man of Verona.

Juliet, a beautiful woman.

Hamlet, a temporary variable from Denmark.

The Ghost, an casual factotum used in the Play.
 

Valores de las variables: 

Cualquier sustantivo tiene valor “1” si su significado es positivo (sustantivos como flor, belleza, amor, etc.) o es neutro (árbol, libro, etc.) y tiene el valor de  “-1” si su significado es negativo (cerdo, asesino, ladrón, etc.). Cada adjetivo que se pone delante del sustantivo multiplica el valor (1 o -1) por 2 de modo que pueden construirse números enteros usando codificación binaria y sumas de variables: 

King =1

Great King=2

Brave Great King=4

Gracious Brave Great King=8  

Los cálculos, claro está, se hacen tediosos. Por ejemplo, si tenemos: 

My gracious King

My gentle beautiful lady

My notorious thief 

Sus valores son 2, 4 y -2 respectivamente. 

Y, asimismo, podríamos decir que  “The difference between my gracious King with My notorious thief and My gentle beautiful lady” será la diferencia entre (+2-2) y 4, o sea 4.


Asignación de valores a las variables 

Para asignar un valor a una variable hay varias maneras pero la más sencilla es anteponer “You” o cualquier otra forma de pronombre de segunda persona en inglés.  Así: 

You stupid jerk big smelly dumb coward = -32

You gentle lovely gentleman=4
 

Acts and Scenes: El programa debe subdividirse en bloques independientes, al modo de las funciones propias de otros lenguajes (en subrutinas, en funciones, en procedimientos). Cada una de estos bloques se denomina “Act” que, a su vez, contienen “Scenes” dentro de las cuales se manipulan las variables. Para definir cada bloque se utilizan números romanos. Este número sirve como etiqueta de referencia para las instrucciones de bifurcación (o sea, para entendernos, las “goto” del Basic de toda la vida). Todo lo que se escriba tras “;” es considerado un comentario por el compilador. 

Act I: Interview with the other side.
 
                    Scene I: At the last hour before dawn.; used here as example


Codificación de cada línea: cada línea individual de código se delimita ente corchetes 

[Enter Juliet]
 

Enter, Exit and Exeunt:

Shakespeare es débil en el manejo de variables. Como hemos dicho anteriormente, estas sólo pueden representar números enteros. Además, en cada momento, sólo puede haber – y debe haber- dos variables activas en “el escenario” (que lo podríamos considerar como una “pila” de dos elementos en los lenguajes clásicos o en aquellas calculadoras HP con notación polaca inversa que muchos hemos usado y amado). Para introducir una variable en el escenario-pila, se usa la orden “Enter” (que admite una o dos variables. Es decir se pueden “enter” al escenario dos variables a la vez (asumiendo que estaba vacío porque si ya había una, nos pasaríamos de dos variables simultáneas):

[Enter Juliet]
[Enter Romeo and Juliet] 

Para sacar una variable del escenario, se usa “Exit”. Esta sólo puede sacar una variable cada vez. Para sacar dos variables a la vez se debe usar Exeunt (pero, recuérdese, para Enter, esta vale para ambos casos). Si se usa Exeunt sin variables, salen todas las variables.

  
[Exit Romeo]
[Exeunt Romeo and Juliet]
[Exeunt]

Operaciones condicionales y de bifuración: 

Las instrucciones condicionales (“IF/THEN” en la mayoría de los otros lenguajes) son escritas aquí  como frases terminadas por el símbolo de interrogación “?”. La expresión “as [adjetivo] as” se interpreta como “=”; la expresión “better tan” como “>” y “worse” como “<”.  Las construcciones “if so” e “if not” actúan como las “then” o “else” de otros lenguajes.  

 Juliet:
 Am I better than you?

Para ejecutar la bifurcación (los “gotos” del lenguaje Basic) se usan las palabras “We shall”, “We must” o “Let us” seguidas de “return to” o de “Proceed to” seguidas de un “act” o una “Scene” para ir a otro lugar del código.  Hay que tener en cuenta que la escena a la que se salta debe estar en el mismo acto. No se puede saltar a una escena de otro acto.
 
Hamlet:
 If so, let us proceed to scene IV. 

Open your heart y Speak your mind: para imprimir (o poner en la pantalla) el valor de una variable. La primera forma imprime el valor de la variable a la que se estás hablando y la segunda imprime la letra o dígito correspondiente (según codificación ASCII).

Listen to your heart y Open your mind:
 
son instrucciones para introducir valores al programa. La primera forma lee un número; la segunda un carácter.  

 
Pila
Existe una pila de variables para cada personaje. Pueden introducirse y extraerse valores en la pila mediante “Remember me” y “recall”.  

 Un ejemplo completo , extraído del tutorial antes enlazado, y que calcula todos los primos menores que un valor dado, es:


Prime Number Computation in Copenhagen.

Romeo, a young man of Verona.

Juliet, a young woman.

Hamlet, a temporary variable from Denmark.

The Ghost, a limiting factor (and by a remarkable coincidence also

Hamlet’s father).
 

Act I: Interview with the other side.

Scene I: At the last hour before dawn.

[Enter the Ghost and Juliet]

The Ghost:

You pretty little warm thing! Thou art as prompt as the difference

between the square of thyself and your golden hair. Speak your mind.

Juliet:

Listen to your heart!

[Exit the Ghost]

[Enter Romeo]

Juliet:

Thou art as sweet as a sunny summer’s day!

Act II: Determining divisibility.

Scene I: A private conversation.

Juliet:

Art thou more cunning than the Ghost?

Romeo:

If so, let us proceed to scene V.

[Exit Romeo]

[Enter Hamlet]

Juliet:

You are as villainous as the square root of Romeo!

Hamlet:

You are as lovely as a red rose.

Scene II: Questions and the consequences thereof.

Juliet:

Am Ibetter than you?

Hamlet:

If so, let us proceed to scene III.

Juliet:

Is the remainder of the quotient between Romeo and me as good as

nothing?

Hamlet:

If so, let us proceed to scene IV.

Thou art as bold as the sum of thyself and a roman.

Juliet:

Let us return to scene II.

Scene III: Romeo must die!

[Exit Hamlet]

[Enter Romeo]

Juliet:

Open your heart.

[Exit Juliet]

[Enter Hamlet]

Romeo:

Thou art as rotten as the difference between nothing and the sum of a

snotty stinking half-witted hog and a small toad!

Speak your mind!

[Exit Romeo]

[Enter Juliet]

Scene IV: One small dog at a time.

[Exit Hamlet]

[Enter Romeo]

Juliet:

Thou art as handsome as the sum of thyself and my chihuahua!

Let us return to scene I.

Scene V: Fin.

[Exeunt]


0 comentarios :