Table of Contents
Tyrel
Ideas Generales
Diseñar un lenguaje de programación con múltiples niveles de sintaxis combinadas, la idea es evitar la necesidad de mezclar diferentes lenguajes para diferentes partes de una aplicación compleja.
Metas
- Basado en bytecode para mayor eficiencia
- Primer nivel de sintaxis basado en instrucciones de pila y RPN
- Segundo nivel de sintaxis basado en S-expressions
- Tercer nivel de sintaxis similar a C++ o Python
- Soporte de orientación a objetos y programación funcional directamente a nivel de bytecode
- Posibilidad de mezclar los tres nveles en un mismo archivo de código por medio de pragmas
- Posibilidad de extender el lenguaje con nuevas sintaxis
- Fácil de integrar con aplicaciones en C y C++, ganando los beneficios de los tres niveles de sintaxis
- Librería estándar directamente disponible en todos los niveles de sintaxis
Estado Actual
- Primera versión preliminar del bytecode
- Primera versión del compilador de la sintaxis de primer nivel
Ejemplos
Ejemplo 1
Llamar a una función global MyFunction con argumentos 1, 2 y 3 (valores enteros) y guardar
el resultado en la variable global z:
- Sintaxis primer nivel
3 2 1 global "MyFunction" get do global "z" set
- Sintaxis segundo nivel
( set 'z ( MyFunction 1 2 3 ))
- Sintaxis tercer nivel
z = MyFunction(1, 2, 3);
Ejemplo 2
Imprimir los valores en la lista [ 1, 2, 3 ], uno a uno:
- Sintaxis primer nivel
[ global "write" get do ] code [ 1 2 3 ] for
- Sintaxis segundo nivel
( for 'x '( 1 2 3 ) '( write x ) )
- Sintaxis tercer nivel
for (x: [1, 2, 3]) { write(x); }
Ejemplo 3
Definir una función global 'Suma' que sume dos números:
- Sintaxis primer nivel
[ global "+" get do ] code global "Suma" set
- Sintaxis segundo nivel
(define 'Suma '( a b ) '( + a b ) )
- Sintaxis tercer nivel
define Suma (a, b) { return (a+b); }
Instrucciones del bytecode
| Nombre | Byte | Descripción | Argumentos | Implementado? |
|---|---|---|---|---|
dup | 1 | Duplica el primer elemento de la pila | <value> | Sí |
drop | 2 | Elimina el primer elemento de la pila | <value> | Sí |
swap | 3 | Intercambia 0: y 1: en la pila | <value1> <value2> | Sí |
clear | 4 | Limpia la pila | Sí | |
[ | 5 | Abre lista | Sí | |
] | 6 | Cierra lista | Sí | |
{ | 7 | Abre diccionario | Sí | |
} | 8 | Cierra diccionario | Sí | |
do | 9 | Ejecuta una acción (primitiva o bloque de código) | <action> | Sí |
if | 10 | Ejecuta una acción condicionalmente | <action> <logical> | Sí |
ifelse | 11 | Ejecuta una u otra acción condicionalmente | <action_true> <action_false> <logical> | Sí |
while | 12 | Realiza un loop mientras se cumple una condición | Sí | |
for | 13 | Realiza un loop sobre una lista | Sí | |
call | 14 | Llama a un método de un objeto | <object> <name> | Sí |
members | 15 | Obtiene el diccionario de miembros de un objeto | <object> | Sí |
new | 16 | Crea una nueva instancia de un objeto | <type> | Parcialmente |
and | 17 | Operador AND lógico | Sí | |
or | 18 | Operador OR lógico | Sí | |
not | 19 | Operador NOT lógico | Sí | |
same | 20 | Compara dos valores según su posición de memoria | Sí | |
global | 21 | Obtiene el diccionario global | Sí | |
local | 22 | Obtiene el diccionario local | Sí | |
equal | 23 | Compara dos valores según representación | Sí | |
break | 24 | Interrumpe un for o while | Parcialmente | |
continue | 25 | Continúa un for o while en la siguiente iteración | Parcialmente | |
set | 26 | Asigna un valor a una clave de un diccionario | Sí | |
get | 27 | Obtiene el valor de una clave de un diccionario | Sí | |
dump | 28 | Muestra el contenido de la pila en pantalla | Sí | |
code | 29 | Compila una lista a un objeto de tipo bloque de código | Sí | |
assert | 30 | Arroja un error si el primer valor de la pila es false | Sí | |
context | 31 | Devuelve el diccionario apropiado (global o local) según el contexto | No | |
raise | 32 | Arroja una excepción usando el primer valor de la pila | No | |
try | 33 | Bloque para capturar excepciones | No | |
switch | 34 | Ejecuta una acción según un valor | No | |
uncode | 35 | Desensambla un bloque de código como lista | No |