Ejecución, Errores y Límites de AST
Esta página explica qué pasa cuando corre un comando AST y cómo depurarlo cuando algo falla.
Flujo de ejecución
Sección titulada «Flujo de ejecución»- Un comando o evento activa la plantilla
- Se resuelven placeholders como
&p1y&t - Se crea el contexto de ejecución con datos del usuario, canal y evento
- El input se tokeniza
- Los tokens se parsean en un AST
- El AST se evalúa
- Las variables se escriben en memoria, caché o base de datos si hace falta
- La salida final se renderiza y se envía al chat
Por qué importa
Sección titulada «Por qué importa»Entender el orden te ayuda a depurar problemas como:
- argumentos que no aparecen donde esperabas
- variables faltantes
- ramas que se ejecutan cuando no deberían
- referencias a comandos con resultados raros
- funciones EventSub que devuelven vacío en el chat
Mensajes de error comunes
Sección titulada «Mensajes de error comunes»| Patrón de Error | Significado |
|---|---|
[Unknown function: name] | La función no está registrada |
[Loop error: invalid loop syntax] | La sintaxis del bucle es inválida |
[Loop error: missing loop body] | Al bucle le faltan {} |
[Parse error: expr] | El parser no pudo entender la expresión |
Usage: $(func ...) | Faltan argumentos o son inválidos |
Límites y reglas de seguridad
Sección titulada «Límites y reglas de seguridad»Límites de bucles por plan
Sección titulada «Límites de bucles por plan»| Plan | Máx. profundidad de anidación | Máx. iteraciones |
|---|---|---|
| Free | 2 | 25 |
| Premium | 3 | 50 |
| Pro | 4 | 100 |
Límites de referencia a comandos
Sección titulada «Límites de referencia a comandos»- profundidad máxima de recursión:
5 - los ciclos se detectan y se frenan
Límites de delay
Sección titulada «Límites de delay»$(delay N)soporta hasta60segundos
Checklist de debugging
Sección titulada «Checklist de debugging»1. Empieza simple
Sección titulada «1. Empieza simple»Antes de construir el comando completo, prueba una versión mínima.
"Hello $(user)!"2. Añade una sola cosa cada vez
Sección titulada «2. Añade una sola cosa cada vez»Buen orden:
- texto plano
- argumentos
- funciones
- variables
- condicionales
- bucles
3. Comprueba la inicialización
Sección titulada «3. Comprueba la inicialización»Si un valor de caché o base de datos puede no existir todavía, compruébalo primero:
*(^(#wins) ? %(#wins) : "no wins yet")4. Recuerda que la asignación es directa
Sección titulada «4. Recuerda que la asignación es directa»Esto está mal si quieres incrementar:
%(#wins 1)Esto está bien:
%(#wins *(%(#wins) + 1))5. Recuerda el contexto EventSub
Sección titulada «5. Recuerda el contexto EventSub»Funciones como $(cheer.amount) o $(reward.input) solo funcionan cuando el comando corre desde el tipo de evento correcto.
Errores comunes
Sección titulada «Errores comunes»Valor de caché vacío
Sección titulada «Valor de caché vacío»Si una variable # o ## expiró, volverá vacía.
Posición de &t
Sección titulada «Posición de &t»&t debe ir al final. No puedes definir nuevos &pN después.
Abusar de bucles
Sección titulada «Abusar de bucles»Si un bucle puede reemplazarse por una expresión directa o una referencia a otro comando, suele ser mejor la opción simple.
Acciones potentes en comandos públicos
Sección titulada «Acciones potentes en comandos públicos»Los comandos que usan moderación, roles, título, juego, encuestas o triggers no deberían estar disponibles para todo el mundo.
Mentalidad práctica para depurar
Sección titulada «Mentalidad práctica para depurar»Cuando un comando falla, hazte estas preguntas en orden:
- ¿Mis argumentos están bien?
- ¿Creé la variable antes de leerla?
- ¿Estoy asignando o incrementando?
- ¿Estoy en el contexto correcto para esa función?
- ¿Creé recursión o demasiada complejidad con bucles?
Consejo para probar con seguridad
Sección titulada «Consejo para probar con seguridad»Construye primero la salida, y después añade los side effects.
Por ejemplo, prueba el texto y la lógica antes de añadir:
$(ban ...)$(vip ...)$(set.title ...)$(start.poll ...)$(trigger.send ...)
Así es mucho más fácil confirmar la lógica antes de que el comando empiece a cambiar el estado real del canal.