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>
drop 2 Elimina el primer elemento de la pila <value>
swap 3 Intercambia 0: y 1: en la pila <value1> <value2>
clear 4 Limpia la pila
[ 5 Abre lista
] 6 Cierra lista
{ 7 Abre diccionario
} 8 Cierra diccionario
do 9 Ejecuta una acción (primitiva o bloque de código) <action>
if 10 Ejecuta una acción condicionalmente <action> <logical>
ifelse 11 Ejecuta una u otra acción condicionalmente <action_true> <action_false> <logical>
while 12 Realiza un loop mientras se cumple una condición
for 13 Realiza un loop sobre una lista
call 14 Llama a un método de un objeto <object> <name>
members 15 Obtiene el diccionario de miembros de un objeto <object>
new 16 Crea una nueva instancia de un objeto <type> Parcialmente
and 17 Operador AND lógico
or 18 Operador OR lógico
not 19 Operador NOT lógico
same 20 Compara dos valores según su posición de memoria
global 21 Obtiene el diccionario global
local 22 Obtiene el diccionario local
equal 23 Compara dos valores según representación
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
get 27 Obtiene el valor de una clave de un diccionario
dump 28 Muestra el contenido de la pila en pantalla
code 29 Compila una lista a un objeto de tipo bloque de código
assert 30 Arroja un error si el primer valor de la pila es false
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

Personal Tools