Especificación - GingerCode/gingercode.org GitHub Wiki
GingerCode especificación
Versión actual
- Current version: 0.0.1-draft
- Wiki
- Open Discussions
El pseudolenguaje en detalle
Comentarios
Los comentarios solo pueden ser en una línea y se traducen literalmente
// Esto es un comentario
// Esto es otro comentario distinto
Sentencias
Definición
Variables
La definición es así:
definir @numero1 = 1
En js se traduce como:
var numero1 = 1;
Tipos de variables
- Numéricas:
definir @numero = 1
- Texto:
definir @texto = "Hola mundo"
definir @otro_texto = 'Hola de nuevo'
- Listas/array/tuplas:
definir @lista = 1 y 2 y 3
definir @otra_lista = 1,2,3
- Diccionario/objetos/estructuras:
@lista_de_tags = "azul","verde","rojo"
@trabajador
@nombre = "Yo mismo"
@id = 123456
@tags = @lista_de_tags
En js se traduce como:
var numero = 1;
var texto = "Hola mundo";
var otro_texto = 'Hola de nuevo';
var lista = [1,2,3];
var otra_lista = [1,2,3];
lista_de_tags = ["azul","verde","rojo"];
trabajador = {
nombre : "Yo mismo",
id : 123456,
tags : lista_de_tags
};
Condicionales
If (si...)
La definición es así si {expresion}\n
:
si 1 > 0
mostrar "A"
En js se traduce como:
if(1 > 0){
console.log("A");
}
else (si no...)
La definición es así si no\n
y lógicamente debe ser precedida por una sentencia tipo if
:
si 1 < 0
mostrar "A"
si no
mostrar "C"
En js se traduce como:
if(1 < 0){
console.log("A");
} else {
console.log("C");
}
else if (pero si...)
La definición es así pero si {expresion}\n
y lógicamente debe ser precedida por una sentencia tipo if
y no necesariamente seguida de una expresión de tipo else
:
si 1 > 0
mostrar "A"
pero si 1<0
mostrar "B"
si no
mostrar "C"
En js se traduce como:
if(1 > 0){
console.log("A");
} else if(1<0){
console.log("B");
} else {
console.log("C");
}
Bucles
for (repetir (contador))
La definición es así repetir {expresion:int} [veces]\n
:
@contador = 0
repetir 5
@contador = @contador + 1
mostrar @contador
En js se traduce como:
contador = 0;
for(var $=0;$<5;$++){
contador = contador + 1;
console.log(contador);
}
while (repetir si...)
La definición es así repetir si {expresion}\n
:
@contador = 5
repetir si @contador>0
@contador = @contador - 1
mostrar @contador
En js se traduce como:
contador = 5;
while(contador>0){
contador = contador - 1;
console.log(contador);
}
foreach (por cada)
La definición es así por cada @value en @values\n
:
@lista = 1, 2 y 3
por cada @cosa en @lista
mostrar @cosa
En js se traduce como:
lista = [1, 2,3];
for(cosa in lista){
console.log(cosa);
}
Funciones/Procedimientos
Definir funciones
La definición es así [procedimiento] #multiplicar [@uno [(y|,) @dos]]\
:
procedimiento #saludar @nombre
mostrar "Hola, " + @nombre
En js se traduce como:
function saludar( nombre){
console.log("Hola, " + nombre);
}
Retorno
La definición es así:
procedimiento #multiplicar @A y @B
devolver @A multiplicado por @B
En js se traduce como:
function multiplicar( A,B){
return A * B;
}
Usar funciones
La definición es así #multiplicar [{expresion} [(y|,) {expresion}]]
:
procedimiento #multiplicar @A y @B
devolver @A multiplicado por @B
mostrar #multiplicar 2 y 2
mostrar #multiplicar 10 y 10
En js se traduce como:
function multiplicar( A,B){
return A * B;
}
console.log(multiplicar(2,2));
console.log(multiplicar(10,10));
Asiganciones
Asignar valor a variable
La definición es así:
@numero1 = 5
En js se traduce como:
numero1 = 5;
Operadores
Lógicos
Todos los operadores lógicos pueden ir en su forma simbólica como en lenguaje natural, todos siguen la misma regla:
La definición es así:
definir @numero1 = 1
definir @numero2 = 2
// igual que..
@condicion = @numero1 == @numero2
@condicion = @numero1 === @numero2
@condicion = @numero1 es igual que @numero2
@condicion = @numero1 igual que @numero2
@condicion = @numero1 igual @numero2
// Mayor que..
@condicion = @numero1 > @numero2
@condicion = @numero1 es mayor que @numero2
@condicion = @numero1 mayor que @numero2
@condicion = @numero1 mayor @numero2
// Mayor o igual que...
@condicion = @numero1 >= @numero2
@condicion = @numero1 es mayor o igual que @numero2
@condicion = @numero1 mayor o igual que @numero2
@condicion = @numero1 mayor o igual @numero2
// Menor que...
@condicion = @numero1 < @numero2
@condicion = @numero1 es menor que @numero2
@condicion = @numero1 menor que @numero2
@condicion = @numero1 menor @numero2
// Menor o igual que...
@condicion = @numero1 <= @numero2
@condicion = @numero1 es menor o igual que @numero2
@condicion = @numero1 menor o igual que @numero2
@condicion = @numero1 menor o igual @numero2
En js se traduce como:
var numero1 = 1;
var numero2 = 2;
// igual que..
condicion = numero1 == numero2;
condicion = numero1 === numero2;
condicion = numero1 == numero2;
condicion = numero1 == numero2;
condicion = numero1 == numero2;
// Mayor que..
condicion = numero1 > numero2;
condicion = numero1 > numero2;
condicion = numero1 > numero2;
condicion = numero1 > numero2;
// Mayor o igual que...
condicion = numero1 >= numero2;
condicion = numero1 >= numero2;
condicion = numero1 >= numero2;
condicion = numero1 >= numero2;
// Menor que...
condicion = numero1 < numero2;
condicion = numero1 < numero2;
condicion = numero1 < numero2;
condicion = numero1 < numero2;
// Menor o igual que...
condicion = numero1 <= numero2;
condicion = numero1 <= numero2;
condicion = numero1 <= numero2;
condicion = numero1 <= numero2;
La lista de sinónimos actual para los operadores lógicos es:
-
"||", "OR", "O"
-
"&&", "AND", "Y"
-
">=", "es mayor o igual que", "mayor o igual que", "mayor o igual"
-
"<=", "es menor o igual que", "menor o igual que", "menor o igual"
-
">", "es mayor que", "mayor que", "mayor"
-
"<", "es menor que", "menor que", "menor"
-
"!=", "es distinto que", "distinto que", "distinto"
-
"!==", "no es"
-
"==", "es igual que", "igual que", "igual"
-
"===", "es", "identico"
Buscamos sugerencias de nuevos sinónimos para hacer Ginger más sencillo a la lectura y adaptable a diferentes niveles de abreviatura
Matemáticos
Los operadores matemáticos se usaran preferentemente en su forma simbólica, pero podrán ser:
La definición es así:
definir @numero1 = 1
definir @numero2 = 2
// Suma
@resultado = @numero1 + @numero2
@resultado = @numero1 mas @numero2
@resultado = "un texto con el número" + @numero1 + "se juntan!"
@resultado = "un texto con el número" mas @numero1 mas "se juntan!"
// Resta
@resultado = @numero1 - @numero2
@resultado = @numero1 menos @numero2
// Multiplicación
@resultado = @numero1 * @numero2
@resultado = @numero1 por @numero2
@resultado = @numero1 multiplicado por @numero2
// División
@resultado = @numero1 / @numero2
@resultado = @numero1 dividido @numero2
@resultado = @numero1 dividido entre @numero2
// Resto/Módulo
@resultado = @numero1 % @numero2
@resultado = @numero1 resto @numero2
@resultado = @numero1 resto entre @numero2
En js se traduce como:
var numero1 = 1;
var numero2 = 2;
// Suma
resultado = numero1 + numero2;
resultado = numero1 + numero2;
resultado = "un texto con el número" + numero1 + "se juntan!";
resultado = "un texto con el número" + numero1 + "se juntan!";
// Resta
resultado = numero1 - numero2;
resultado = numero1 - numero2;
// Multiplicación
resultado = numero1 * numero2;
resultado = numero1 * numero2;
resultado = numero1 * numero2;
// División
resultado = numero1 / numero2;
resultado = numero1 / numero2;
resultado = numero1 / numero2;
// Resto/Módulo
resultado = numero1 % numero2;
resultado = numero1 % numero2;
resultado = numero1 % numero2;
La lista actual de operadores matemáticos es:
- resta: "-", "menos"
- suma: "+", "mas", "sumar", "sumado"
- multiplicación: "*", "multiplicado por", "multiplicado", "por"
- división: "/", "dividido entre", "dividido"
- resto: "%", "resto entre", "resto"
Buscamos sugerencias de nuevos sinónimos para hacer Ginger más sencillo a la lectura y adaptable a diferentes niveles de abreviatura
Rutina de expresiones
- Operandos: Una variable, una propiedad, un numero o un string (
@aZ|@aZ@aZ|-?0-9|""|''
) - Operadores: Todos los lógicos y matemáticos
Una expresión consiste en la sucesión de operandos y operadores o un solo operando, o una llamada a procedimiento/función
Utilidades
Mostrar al usuario
Actual igual que un console.log()
mostrar "hola mundo"
En js se traduce como:
console.log("hola mundo");
Pedir información al usuario
Actual igual que un prompt()
pedir @nombre
En js se traduce como:
var nombre = window.prompt('nombre');
Aleatorio, y otras extensiones...
GingerCode puede extenderse fácilmente con funciones precargadas que facilitan la comprensión tecnica y reducen la barrera de entrada a ejercicios más avanzados. Veamos el siguiente ejemplo... La definición es así:
definir @random_number = #aleatorio 100 y 10
En js se traduce como:
var random_number = aleatorio(100,10);
// Funciones precargadas
function aleatorio(min,max){
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Limitaciones
Sentencia precedida de tabulacion \t+{sentencia}\n
:
El nivel de tabulación solo puede ser 0 o un nivel mayor o igual a la linea anterior
Si es un nivel mayor debe estar abierto algun tipo de bloque
Solo en el caso del objeto literal se limitan las sentencias posibles dentro del bloque a declaraciones de variables
Otras
- No puede definirse variables vacías
definir @algo
o equivalentesnull
(definir @algo = null
),undefined
(definir @algo = undefined
), etc... - Solo pueden usarse comillas dobles y simples para trabajar con cadenas de texto, Template Strings no esta soportado.
- Solo se soportan los comentarios de este tipo (
//
), no se soporta ningún otro tipo (#
) o multilinea (/* */
)