Ir al contenido

Sintaxis y Datos de AST

Esta página cubre la sintaxis principal que usarás para construir comandos AST.

El parser entiende 5 prefijos importantes:

PrefijoSintaxisPropósitoEjemplo
$( $(funcName arg1 arg2)Llamar una función$(random 10)
%( %(name) o %(name value)Leer o escribir una variable%(wins), %(wins 5)
*( *(condition ? yes : no)Calcular lógica o matemáticas*(5 > 3 ? "yes" : "no")
^( ^(variableName)Comprobar existencia^(#wins)
#( #(commandName args...)Llamar otro comando#(othercmd arg1)

Las variables las creas tú. Pueden ser temporales o persistentes según el prefijo que uses.

PrefijoAlmacenamientoPersistenciaPlanEjemplo
ningunoMemoriaSolo la ejecución actualFree%(temp)
#CachéHasta 24 horasFree%(#wins)
##Caché + por usuarioHasta 24 horasFree%(##chips)
*Base de datosPermanentePremium / Pro%(*wins)
**Base de datos + por usuarioPermanentePremium / Pro%(**rank)
  1. Las variables de caché expiran después de unas 24 horas.
  2. Si una variable de caché expiró, vuelve vacía, no con 0.
  3. La asignación sobrescribe.
Ventana de terminal
%(#wins 1)

Ese ejemplo pone el valor en 1. No suma 1.

Ventana de terminal
%(#wins *(%(#wins) + 1))

Los valores por usuario pueden apuntar a otro usuario:

Ventana de terminal
%(##rank)
%(##rank(&p1))
%(**rank)
%(**rank(&p1))

Cuando un viewer usa un comando, sus argumentos se pueden acceder con placeholders.

PlaceholderSignificadoEjemplo
&p1, &p2, &p3Argumentos posicionales&p1 = primer argumento
&tTodo el texto restante&t = todo lo que queda
  • &t debe ir al final
  • no puedes crear nuevos &pN después de &t
Ventana de terminal
Comando: !greet Hello World
Mensaje: Hello &p1 and &p2!
Hello Hello and World!
Ventana de terminal
Comando: !echo lots of args here
Mensaje: &p1 &p2 &t
lots of args here
Ventana de terminal
Mensaje: &t &p1
Error: cannot create new &pN after &t

Usa comillas dobles y ${} cuando quieras interpolación dentro de un string.

Ventana de terminal
"Hola ${$(user)}!"
"Has ganado ${%(#wins)} veces!"

Los paréntesis definen dónde empieza y termina una expresión, así que un ) literal dentro de una la cerraría antes de tiempo. Tienes tres herramientas para incluir caracteres especiales como texto plano:

  1. Los pares balanceados funcionan directamente. Los paréntesis que abren y cierran dentro de una expresión se mantienen como texto:

    Ventana de terminal
    $(say score (5-3))
    score ( 5 - 3 )
  2. Las comillas dobles protegen cualquier texto, incluidos caracteres desbalanceados:

    Ventana de terminal
    $(say "quoted :) here")
    quoted :) here
  3. Los escapes con barra invertida protegen un solo carácter. Usa \( \) \[ \] \{ \} \; \? \: y \\:

    Ventana de terminal
    $(say hello \:\))
    hello :)
    %(mood \:\)) %(mood)
    :)
Ventana de terminal
%[item1, item2, item3]
%[1, 2, 3, 4, 5]
SintaxisSignificadoEjemplo
%(arr[0])Acceder por índice%(items[0])
%(arr[-1])Acceder desde el final%(items[-1]) = último elemento
%(arr[random])Elemento aleatorio%(items[random])
%(arr[].length)Longitud del array%(items[].length)
%(arr[] value)Agregar valor%(items[] extra)
%(arr[2] value)Reemplazar por índice%(items[2] updated)
Ventana de terminal
%(items[0])
%(items[random])
%(items[].length)
%(items[] extra)
%(items[1] replacement)
%[1, 2, 3][random]
OperadorSignificadoEjemplo
== o =Igual%(wins) == 5
!= o <>Distinto%(status) != "offline"
>Mayor que%(level) > 3
<Menor que%(age) < 18
>=Mayor o igual%(wins) >= 10
<=Menor o igual%(wins) <= 5
~=Contiene%(tags) ~= "gaming"
OperadorSignificadoEjemplo
+Sumar*(%(#wins) + 1)
-Restar*(%(#wins) - 1)
*Multiplicar*(%(x) * 2)
/Dividir*(%(total) / 2)
%Módulo*(%(count) % 10)
OperadorSignificado
+Más unario
-Negación

Estos son para variables de bucle solamente:

OperadorSignificado
=Asignar
++Incrementar en 1
--Decrementar en 1
+=Sumar y asignar
-=Restar y asignar
*=Multiplicar y asignar
/=Dividir y asignar
%=Módulo y asignar

AST usa expresiones ternarias para ramificar lógica:

Ventana de terminal
*(condition ? trueValue : falseValue)
*(%(#wins) > 10 ? "Champion" : "Keep trying")
*(%(islive) == 1 ? "Stream is live!" : "Stream is offline")
Ventana de terminal
*(for #i = 0; #i < 3; #i++ {
%(out[] #i)
})
Ventana de terminal
*(for #item in %(#items[]) {
%(result[] %(#item))
})
FunciónPropósito
$(break)Salir del bucle inmediatamente
$(continue)Saltar la iteración actual
PlanMáx. profundidad de anidaciónMáx. iteraciones
Free225
Premium350
Pro4100
Ventana de terminal
*(for #i = 0; #i < %(#count); #i++ {
%(output[] #i)
})
"Tus números: ${%(output[])}"

Puedes ejecutar un comando dentro de otro:

Ventana de terminal
#(othercmd arg1 arg2)
  • profundidad máxima de recursión: 5
  • los ciclos se detectan y bloquean
  • la salida del comando referenciado se parsea y se inserta de vuelta

Usa ^() para preguntar si algo existe:

Ventana de terminal
^(#wins)
^(#items[0])
^(##balance)

Esto devuelve true o false.