codexivo 0.2.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/dist/index.js +18 -16
- package/dist/index.js.map +6 -6
- package/dist/worker.js +18 -16
- package/dist/worker.js.map +4 -4
- package/docs/especificacion-v1.md +19 -14
- package/docs/lenguaje.md +22 -8
- package/package.json +1 -1
- package/src/catalog.ts +1 -0
- package/src/error-codes.ts +5 -0
- package/src/runtime/builtins.ts +44 -0
- package/src/runtime/values.ts +1 -0
package/dist/index.js.map
CHANGED
|
@@ -7,24 +7,24 @@
|
|
|
7
7
|
"import { CodexivoError } from '../errors';\nimport { KEYWORDS, TokenType } from './token';\nimport type { Position, Span, Token } from './token';\n\nexport interface LexResult {\n tokens: Token[];\n errors: CodexivoError[];\n}\n\nconst LETTER = /[A-Za-z_À-ÖØ-öø-ÿ]/;\nconst DIGIT = /[0-9]/;\nconst WHITESPACE = /\\s/;\n\nconst TWO_CHAR_OPERATORS: Readonly<Record<string, TokenType>> = {\n '==': TokenType.EQ,\n '!=': TokenType.NEQ,\n '<=': TokenType.LTE,\n '>=': TokenType.GTE,\n '+=': TokenType.PLUS_ASSIGN,\n '-=': TokenType.MINUS_ASSIGN,\n '*=': TokenType.STAR_ASSIGN,\n '/=': TokenType.SLASH_ASSIGN,\n '%=': TokenType.PERCENT_ASSIGN,\n '++': TokenType.INCREMENT,\n '--': TokenType.DECREMENT,\n};\n\nconst ONE_CHAR_OPERATORS: Readonly<Record<string, TokenType>> = {\n '=': TokenType.ASSIGN,\n '+': TokenType.PLUS,\n '-': TokenType.MINUS,\n '*': TokenType.STAR,\n '/': TokenType.SLASH,\n '%': TokenType.PERCENT,\n '^': TokenType.CARET,\n '!': TokenType.BANG,\n '<': TokenType.LT,\n '>': TokenType.GT,\n ',': TokenType.COMMA,\n ':': TokenType.COLON,\n '.': TokenType.DOT,\n ';': TokenType.SEMICOLON,\n '(': TokenType.LPAREN,\n ')': TokenType.RPAREN,\n '{': TokenType.LBRACE,\n '}': TokenType.RBRACE,\n '[': TokenType.LBRACKET,\n ']': TokenType.RBRACKET,\n};\n\nconst VALUE_ENDS = new Set([\n TokenType.IDENT,\n TokenType.NUMBER,\n TokenType.STRING,\n TokenType.RPAREN,\n TokenType.RBRACKET,\n TokenType.RBRACE,\n]);\n\nconst ESCAPES: Readonly<Record<string, string>> = {\n n: '\\n',\n t: '\\t',\n '\\\\': '\\\\',\n '\"': '\"',\n \"'\": \"'\",\n};\n\nconst ILLEGAL_HINTS: Readonly<Record<string, string>> = {\n '&': 'Para el «y» lógico escribe la palabra `y`.',\n '|': 'Para el «o» lógico escribe la palabra `o`.',\n '“': 'Parece una comilla tipográfica; usa comillas rectas `\"`.',\n '”': 'Parece una comilla tipográfica; usa comillas rectas `\"`.',\n '‘': \"Parece una comilla tipográfica; usa comillas rectas `'`.\",\n '’': \"Parece una comilla tipográfica; usa comillas rectas `'`.\",\n};\n\n/** Convierte código fuente en tokens. Nunca lanza: los problemas se reportan en `errors`. */\nexport const tokenize = (source: string): LexResult => {\n const tokens: Token[] = [];\n const errors: CodexivoError[] = [];\n\n let offset = 0;\n let line = 1;\n let column = 1;\n\n const position = (): Position => ({ line, column, offset });\n const peek = (ahead = 0): string => source[offset + ahead] ?? '';\n const advance = (): string => {\n const character = source[offset] ?? '';\n offset += 1;\n if (character === '\\n') {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n return character;\n };\n\n const push = (type: TokenType, start: Position, value?: number | string): Token => {\n const token: Token = { type, lexeme: source.slice(start.offset, offset), span: { start, end: position() } };\n if (value !== undefined) token.value = value;\n tokens.push(token);\n return token;\n };\n\n const lexicalError = (code: string, message: string, span: Span, hint?: string) => {\n errors.push(new CodexivoError({ kind: 'léxico', code, message, hint, span }));\n };\n\n while (offset < source.length) {\n const character = peek();\n\n if (WHITESPACE.test(character)) {\n advance();\n continue;\n }\n\n const start = position();\n\n // comentarios\n if (character === '/' && peek(1) === '/') {\n while (offset < source.length && peek() !== '\\n') advance();\n continue;\n }\n if (character === '/' && peek(1) === '*') {\n advance();\n advance();\n while (offset < source.length && !(peek() === '*' && peek(1) === '/')) advance();\n if (offset >= source.length) {\n lexicalError(\n 'COMENTARIO_SIN_CERRAR',\n 'El comentario que empieza aquí no se cerró.',\n {\n start,\n end: { line: start.line, column: start.column + 2, offset: start.offset + 2 },\n },\n 'Cierra el comentario con `*/`.',\n );\n } else {\n advance();\n advance();\n }\n continue;\n }\n\n // números\n // Después de un valor, `.` es acceso a un campo (`d.1` es un error claro, no `d` seguido de `.1`).\n const last = tokens[tokens.length - 1];\n const afterValue = last !== undefined && VALUE_ENDS.has(last.type) && last.span.end.offset === offset;\n if (DIGIT.test(character) || (character === '.' && DIGIT.test(peek(1)) && !afterValue)) {\n // `_` separa grupos de dígitos (`1_000_000`); se revisa que esté bien puesto al final.\n const digits = () => {\n while (DIGIT.test(peek()) || peek() === '_') advance();\n };\n digits();\n if (peek() === '.' && DIGIT.test(peek(1))) {\n advance();\n digits();\n }\n if (LETTER.test(peek()) && peek() !== '_') {\n while (LETTER.test(peek()) || DIGIT.test(peek())) advance();\n const token = push(TokenType.ILLEGAL, start);\n lexicalError(\n 'NOMBRE_EMPIEZA_CON_NÚMERO',\n `\\`${token.lexeme}\\` no es un número ni un nombre válido.`,\n token.span,\n 'Los nombres no pueden empezar con un dígito. Si es una multiplicación, escribe el operador: `2 * x`.',\n );\n continue;\n }\n const text = source.slice(start.offset, offset);\n if (/(^|\\D)_|_(\\D|$)/.test(text)) {\n const token = push(TokenType.ILLEGAL, start);\n lexicalError(\n 'SEPARADOR_INVÁLIDO',\n `\\`${text}\\` no es un número válido.`,\n token.span,\n 'El `_` solo puede ir entre dos dígitos para separar grupos, como en `1_000_000`.',\n );\n continue;\n }\n push(TokenType.NUMBER, start, Number(text.replaceAll('_', '')));\n continue;\n }\n\n // nombres y palabras reservadas\n if (LETTER.test(character)) {\n while (LETTER.test(peek()) || DIGIT.test(peek())) advance();\n const word = source.slice(start.offset, offset);\n push(KEYWORDS[word] ?? TokenType.IDENT, start);\n continue;\n }\n\n // textos\n if (character === '\"' || character === \"'\") {\n const quote = advance();\n let value = '';\n let closed = false;\n while (offset < source.length && peek() !== '\\n') {\n const current = advance();\n if (current === quote) {\n closed = true;\n break;\n }\n if (current === '\\\\') {\n const escapeStart = { line, column: column - 1, offset: offset - 1 };\n const escaped = advance();\n const replacement = ESCAPES[escaped];\n if (replacement === undefined) {\n lexicalError(\n 'ESCAPE_DESCONOCIDO',\n `\\`\\\\${escaped}\\` no es una secuencia de escape válida.`,\n { start: escapeStart, end: position() },\n 'Las secuencias válidas son `\\\\n`, `\\\\t`, `\\\\\\\\`, `\\\\\"` y `\\\\\\'`.',\n );\n value += escaped;\n } else {\n value += replacement;\n }\n continue;\n }\n value += current;\n }\n const token = push(TokenType.STRING, start, value);\n if (!closed) {\n lexicalError(\n 'TEXTO_SIN_CERRAR',\n 'El texto que empieza aquí no se cerró.',\n token.span,\n `Agrega la comilla \\`${quote}\\` al final. Un texto no puede ocupar varias líneas; usa \\`\\\\n\\` para un salto de línea.`,\n );\n }\n continue;\n }\n\n // operadores y delimitadores\n const pair = character + peek(1);\n const twoChar = TWO_CHAR_OPERATORS[pair];\n if (twoChar) {\n advance();\n advance();\n push(twoChar, start);\n continue;\n }\n const oneChar = ONE_CHAR_OPERATORS[character];\n if (oneChar) {\n advance();\n push(oneChar, start);\n continue;\n }\n\n advance();\n const token = push(TokenType.ILLEGAL, start);\n lexicalError(\n 'CARÁCTER_DESCONOCIDO',\n `Codexivo no reconoce el carácter \\`${character}\\`.`,\n token.span,\n ILLEGAL_HINTS[character],\n );\n }\n\n const end = position();\n tokens.push({ type: TokenType.EOF, lexeme: '', span: { start: end, end } });\n return { tokens, errors };\n};\n",
|
|
8
8
|
"import { CodexivoError } from '../errors';\nimport type * as ast from './ast';\nimport { tokenize } from './lexer';\nimport { describeToken, describeTokenType, TokenType } from './token';\nimport type { Position, Span, Token } from './token';\n\nexport interface ParseResult {\n program: ast.Program;\n tokens: Token[];\n /** Errores léxicos y sintácticos, en el orden en que aparecen en el código. */\n errors: CodexivoError[];\n}\n\n/** Analiza el código y construye el AST. Nunca lanza: los problemas se reportan en `errors`. */\nexport const parse = (source: string): ParseResult => {\n const { tokens, errors: lexicalErrors } = tokenize(source);\n const parser = new Parser(tokens);\n const program = parser.parseProgram();\n const errors = [...lexicalErrors, ...parser.errors].sort(\n (a, b) => (a.span?.start.offset ?? 0) - (b.span?.start.offset ?? 0),\n );\n return { program, tokens, errors };\n};\n\nenum Precedence {\n LOWEST,\n OR,\n AND,\n NOT,\n COMPARE,\n SUM,\n PRODUCT,\n UNARY,\n POWER,\n CALL,\n}\n\nconst INFIX_PRECEDENCE: Partial<Record<TokenType, Precedence>> = {\n [TokenType.OR]: Precedence.OR,\n [TokenType.AND]: Precedence.AND,\n [TokenType.EQ]: Precedence.COMPARE,\n [TokenType.NEQ]: Precedence.COMPARE,\n [TokenType.LT]: Precedence.COMPARE,\n [TokenType.GT]: Precedence.COMPARE,\n [TokenType.LTE]: Precedence.COMPARE,\n [TokenType.GTE]: Precedence.COMPARE,\n [TokenType.PLUS]: Precedence.SUM,\n [TokenType.MINUS]: Precedence.SUM,\n [TokenType.STAR]: Precedence.PRODUCT,\n [TokenType.SLASH]: Precedence.PRODUCT,\n [TokenType.PERCENT]: Precedence.PRODUCT,\n [TokenType.MOD]: Precedence.PRODUCT,\n [TokenType.DIV]: Precedence.PRODUCT,\n [TokenType.CARET]: Precedence.POWER,\n [TokenType.LPAREN]: Precedence.CALL,\n [TokenType.LBRACKET]: Precedence.CALL,\n [TokenType.DOT]: Precedence.CALL,\n};\n\nconst BINARY_OPERATORS: Partial<Record<TokenType, ast.BinaryOperator>> = {\n [TokenType.PLUS]: '+',\n [TokenType.MINUS]: '-',\n [TokenType.STAR]: '*',\n [TokenType.SLASH]: '/',\n [TokenType.PERCENT]: 'mod',\n [TokenType.MOD]: 'mod',\n [TokenType.DIV]: 'div',\n [TokenType.CARET]: '^',\n [TokenType.EQ]: '==',\n [TokenType.NEQ]: '!=',\n [TokenType.LT]: '<',\n [TokenType.GT]: '>',\n [TokenType.LTE]: '<=',\n [TokenType.GTE]: '>=',\n};\n\nconst ASSIGNMENT_OPERATORS: Partial<Record<TokenType, ast.AssignmentOperator>> = {\n [TokenType.ASSIGN]: '=',\n [TokenType.PLUS_ASSIGN]: '+=',\n [TokenType.MINUS_ASSIGN]: '-=',\n [TokenType.STAR_ASSIGN]: '*=',\n [TokenType.SLASH_ASSIGN]: '/=',\n [TokenType.PERCENT_ASSIGN]: '%=',\n};\n\nconst INCREMENT_OPERATORS: Partial<Record<TokenType, ast.IncrementOperator>> = {\n [TokenType.INCREMENT]: '++',\n [TokenType.DECREMENT]: '--',\n};\n\nconst STATEMENT_KEYWORDS = new Set([\n TokenType.LET,\n TokenType.DOMAIN,\n TokenType.CONST,\n TokenType.REPEAT,\n TokenType.FOR_EACH,\n TokenType.BREAK,\n TokenType.CONTINUE,\n TokenType.FUNCTION,\n TokenType.RETURN,\n TokenType.IF,\n TokenType.WHILE,\n TokenType.DO,\n TokenType.FOR,\n]);\n\n/** Lo único que puede ir dentro de un `dominio`. */\nconst DOMAIN_MEMBERS = new Set<ast.Statement['kind']>(['VariableDeclaration', 'FunctionDeclaration', 'Domain']);\n\n/** Cómo empieza una sentencia, para nombrarla en un mensaje. */\nconst printStart = (statement: ast.Statement): string | undefined => {\n switch (statement.kind) {\n case 'If':\n return 'si';\n case 'While':\n return 'mientras';\n case 'DoUntil':\n return 'hacer';\n case 'For':\n return 'para';\n case 'ForEach':\n return 'para_cada';\n case 'Repeat':\n return 'repetir';\n case 'Return':\n return 'regresa';\n case 'Break':\n return 'romper';\n case 'Continue':\n return 'continuar';\n case 'Block':\n return '{';\n default:\n return undefined;\n }\n};\n\nconst KEYWORD_LIKE_TYPOS: Readonly<Record<string, string>> = {\n sino: 'En Codexivo se escribe `si_no`, con guion bajo.',\n pero: 'En Codexivo se escribe `pero_si`, con guion bajo.',\n};\n\nconst MAX_ERRORS = 50;\nconst MAX_DEPTH = 400;\n\n/** Señal interna para abandonar la sentencia actual. El error, si lo hay, ya se registró. */\nclass ParseFailure {}\n\nclass Parser {\n readonly errors: CodexivoError[] = [];\n private position = 0;\n private nextId = 1;\n private depth = 0;\n /**\n * Paréntesis, corchetes o llaves abiertos alrededor de la expresión actual. Dentro de ellos una expresión puede\n * seguir en la línea siguiente; fuera, un salto de línea la termina (salvo después de un operador).\n */\n private grouping = 0;\n /** Bucles abiertos alrededor de la sentencia actual, sin contar los de afuera de un procedimiento. */\n private loopDepth = 0;\n\n constructor(private readonly tokens: Token[]) {}\n\n parseProgram(): ast.Program {\n const start = this.current.span.start;\n const statements = this.parseStatements(TokenType.EOF);\n return { kind: 'Program', id: this.id(), statements, span: { start, end: this.current.span.end } };\n }\n\n // ── utilidades ─────────────────────────────────────────────────────────────\n\n private get current(): Token {\n return this.tokens[this.position] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private get previous(): Token {\n return this.tokens[this.position - 1] ?? this.current;\n }\n\n private peek(ahead = 1): Token {\n return this.tokens[this.position + ahead] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private id(): number {\n return this.nextId++;\n }\n\n private advance(): Token {\n const token = this.current;\n if (token.type !== TokenType.EOF) this.position += 1;\n return token;\n }\n\n private check(type: TokenType): boolean {\n return this.current.type === type;\n }\n\n private match(type: TokenType): boolean {\n if (!this.check(type)) return false;\n this.advance();\n return true;\n }\n\n private spanFrom(start: Position): Span {\n return { start, end: this.previous.span.end };\n }\n\n private error(code: string, message: string, span: Span, hint?: string): never {\n if (this.errors.length < MAX_ERRORS) {\n this.errors.push(new CodexivoError({ kind: 'sintaxis', code, message, hint, span }));\n }\n throw new ParseFailure();\n }\n\n /** Un token ILLEGAL ya tiene su error léxico; no lo reportamos dos veces. */\n private failSilentlyOnIllegal(): void {\n if (this.check(TokenType.ILLEGAL)) throw new ParseFailure();\n }\n\n private expect(type: TokenType, context: string, hint?: string): Token {\n if (this.check(type)) return this.advance();\n this.failSilentlyOnIllegal();\n const found = this.current;\n let finalHint = hint;\n if (type === TokenType.RPAREN && found.type === TokenType.ASSIGN) {\n finalHint = 'Para comparar se usa `es_igual_a` (o `==`); un solo `=` sirve para asignar.';\n }\n this.error(\n 'TOKEN_ESPERADO',\n `Se esperaba ${describeTokenType(type)} ${context}, pero se encontró ${describeToken(found)}.`,\n found.span,\n finalHint,\n );\n }\n\n private enter(): void {\n this.depth += 1;\n if (this.depth > MAX_DEPTH) {\n this.error(\n 'ANIDAMIENTO_EXCESIVO',\n 'El programa tiene demasiados niveles anidados.',\n this.current.span,\n 'Divide la expresión en variables intermedias.',\n );\n }\n }\n\n private leave(): void {\n this.depth -= 1;\n }\n\n /** Salta tokens hasta un punto seguro para seguir analizando después de un error. */\n private synchronize(failedAt: Token): void {\n if (this.position === this.tokens.indexOf(failedAt) && !this.check(TokenType.EOF)) this.advance();\n while (!this.check(TokenType.EOF)) {\n if (this.previous.type === TokenType.SEMICOLON) return;\n if (this.check(TokenType.RBRACE)) return;\n if (STATEMENT_KEYWORDS.has(this.current.type)) return;\n if (this.current.span.start.line > failedAt.span.start.line) return;\n this.advance();\n }\n }\n\n // ── sentencias ─────────────────────────────────────────────────────────────\n\n private parseStatements(terminator: TokenType.EOF | TokenType.RBRACE): ast.Statement[] {\n // Un bloque dentro de un paréntesis (el cuerpo de un procedimiento que se pasa como argumento) vuelve a\n // terminar sus sentencias con el salto de línea.\n const grouping = this.grouping;\n this.grouping = 0;\n try {\n return this.parseStatementList(terminator);\n } finally {\n this.grouping = grouping;\n }\n }\n\n private parseStatementList(terminator: TokenType.EOF | TokenType.RBRACE): ast.Statement[] {\n const statements: ast.Statement[] = [];\n let recovering = false;\n while (!this.check(terminator) && !this.check(TokenType.EOF)) {\n const failedAt = this.current;\n try {\n if (terminator === TokenType.EOF && this.check(TokenType.RBRACE)) {\n // Una `}` sobrante después de un error suele ser parte de lo que ya se reportó.\n if (recovering) {\n this.advance();\n continue;\n }\n this.error('LLAVE_SOBRANTE', 'Sobra esta `}`: no hay ningún bloque abierto.', this.current.span);\n }\n statements.push(this.parseStatement());\n recovering = false;\n } catch (error) {\n if (!(error instanceof ParseFailure)) throw error;\n this.depth = 0;\n recovering = true;\n this.synchronize(failedAt);\n }\n }\n this.checkDuplicateProcedures(statements);\n return statements;\n }\n\n /** Un procedimiento con nombre existe desde el inicio de su bloque, así que su nombre no se puede repetir ahí. */\n private checkDuplicateProcedures(statements: ast.Statement[]): void {\n const procedures = new Set(\n statements.flatMap(statement => (statement.kind === 'FunctionDeclaration' ? [statement.name.name] : [])),\n );\n if (procedures.size === 0) return;\n const seen = new Set<string>();\n for (const statement of statements) {\n if (statement.kind !== 'FunctionDeclaration' && statement.kind !== 'VariableDeclaration') continue;\n const { name } = statement;\n if (!procedures.has(name.name)) continue;\n if (statement.kind === 'FunctionDeclaration' && !seen.has(name.name)) {\n seen.add(name.name);\n continue;\n }\n if (this.errors.length >= MAX_ERRORS) return;\n this.errors.push(\n new CodexivoError({\n kind: 'sintaxis',\n code: 'NOMBRE_REPETIDO',\n message: `Ya hay un procedimiento llamado \\`${name.name}\\` en este bloque.`,\n hint: 'Un procedimiento con nombre existe desde el inicio de su bloque; cambia uno de los dos nombres.',\n span: name.span,\n }),\n );\n }\n }\n\n private parseStatement(): ast.Statement {\n const token = this.current;\n switch (token.type) {\n case TokenType.SEMICOLON:\n this.advance();\n return this.parseStatementAfterStraySemicolon();\n case TokenType.LET:\n case TokenType.CONST:\n return this.endSimpleStatement(this.parseVariableDeclaration());\n case TokenType.RETURN:\n return this.endSimpleStatement(this.parseReturn());\n case TokenType.IF:\n return this.endCompoundStatement(this.parseIf());\n case TokenType.WHILE:\n return this.endCompoundStatement(this.parseWhile());\n case TokenType.DO:\n return this.endSimpleStatement(this.parseDoUntil());\n case TokenType.FOR:\n return this.endCompoundStatement(this.parseFor());\n case TokenType.REPEAT:\n return this.endCompoundStatement(this.parseRepeat());\n case TokenType.FOR_EACH:\n return this.endCompoundStatement(this.parseForEach());\n case TokenType.DOMAIN:\n return this.endCompoundStatement(this.parseDomain());\n case TokenType.BREAK:\n case TokenType.CONTINUE:\n return this.endSimpleStatement(this.parseLoopJump());\n case TokenType.IN:\n this.error('EN_SIN_PARA_CADA', '`en` solo se usa dentro de `para_cada … en …`.', token.span);\n case TokenType.FUNCTION:\n if (this.peek().type === TokenType.IDENT) return this.endCompoundStatement(this.parseFunctionDeclaration());\n return this.endSimpleStatement(this.parseSimpleStatement());\n case TokenType.LBRACE:\n if (\n (this.peek().type === TokenType.STRING || this.peek().type === TokenType.NUMBER) &&\n this.peek(2).type === TokenType.COLON\n ) {\n this.error(\n 'DICCIONARIO_COMO_SENTENCIA',\n 'Al inicio de una sentencia, `{` abre un bloque, no un diccionario.',\n token.span,\n 'Guarda el diccionario en una variable: `variable d = { \"clave\": valor }`.',\n );\n }\n return this.endCompoundStatement(this.parseBlock('para abrir el bloque'));\n case TokenType.ELSE:\n case TokenType.ELSEIF:\n this.error(\n 'RAMA_SIN_SI',\n `${describeToken(token)} tiene que ir justo después del \\`}\\` de un \\`si\\`.`,\n token.span,\n );\n case TokenType.UNTIL:\n this.error('HASTA_QUE_SIN_HACER', '`hasta_que` tiene que ir justo después del `}` de un `hacer`.', token.span);\n case TokenType.IDENT: {\n const typoHint = KEYWORD_LIKE_TYPOS[token.lexeme];\n const next = this.peek();\n if (\n typoHint &&\n (next.type === TokenType.LBRACE || next.type === TokenType.IF || next.type === TokenType.LPAREN)\n ) {\n this.error('PALABRA_DESCONOCIDA', `\\`${token.lexeme}\\` no es una palabra de Codexivo.`, token.span, typoHint);\n }\n return this.endSimpleStatement(this.parseSimpleStatement());\n }\n default:\n return this.endSimpleStatement(this.parseSimpleStatement());\n }\n }\n\n private parseStatementAfterStraySemicolon(): ast.Statement {\n // `;;` o un `;` suelto no hacen nada; seguimos con lo que venga.\n if (this.check(TokenType.EOF) || this.check(TokenType.RBRACE)) {\n const span = this.previous.span;\n return { kind: 'Block', id: this.id(), statements: [], span };\n }\n return this.parseStatement();\n }\n\n /** Después de una sentencia simple va `;`, el final de la línea, `}` o el final del programa. */\n private endSimpleStatement<T extends ast.Statement>(statement: T): T {\n if (this.match(TokenType.SEMICOLON)) return statement;\n if (this.check(TokenType.RBRACE) || this.check(TokenType.EOF)) return statement;\n if (this.current.span.start.line > this.previous.span.end.line) return statement;\n this.failSilentlyOnIllegal();\n this.error(\n 'FIN_DE_SENTENCIA',\n `Se esperaba \\`;\\` o un salto de línea antes de ${describeToken(this.current)}.`,\n this.current.span,\n 'Si querías combinar dos valores, falta un operador entre ellos.',\n );\n }\n\n private endCompoundStatement<T extends ast.Statement>(statement: T): T {\n this.match(TokenType.SEMICOLON);\n return statement;\n }\n\n private parseVariableDeclaration(): ast.VariableDeclaration {\n const keyword = this.advance(); // variable / constante\n const constant = keyword.type === TokenType.CONST;\n const name = this.parseBindingName(`después de \\`${keyword.lexeme}\\``);\n this.expect(\n TokenType.ASSIGN,\n `después de \\`${keyword.lexeme} ${name.name}\\``,\n constant\n ? `Toda constante necesita su valor desde el principio: \\`constante ${name.name} = 10\\`.`\n : `Toda variable empieza con un valor: \\`variable ${name.name} = 0\\`.`,\n );\n const value = this.parseExpression();\n if (value.kind === 'FunctionLiteral' && !value.name) value.name = name.name;\n return {\n kind: 'VariableDeclaration',\n id: this.id(),\n constant,\n name,\n value,\n span: this.spanFrom(keyword.span.start),\n };\n }\n\n private parseBindingName(context: string): ast.Identifier {\n const token = this.current;\n if (token.type !== TokenType.IDENT) {\n this.failSilentlyOnIllegal();\n if (token.lexeme && /^[a-z_]+$/.test(token.lexeme) && token.type !== TokenType.EOF) {\n // Se salta la palabra para que, al recuperarse, no empiece otra sentencia (`variable dominio = 1`).\n this.advance();\n this.error(\n 'PALABRA_RESERVADA',\n `\\`${token.lexeme}\\` es una palabra reservada y no se puede usar como nombre.`,\n token.span,\n 'Elige otro nombre, por ejemplo agregando una palabra: `valor_inicial`.',\n );\n }\n this.error(\n 'NOMBRE_ESPERADO',\n `Se esperaba un nombre ${context}, pero se encontró ${describeToken(token)}.`,\n token.span,\n );\n }\n this.advance();\n return { kind: 'Identifier', id: this.id(), name: token.lexeme, span: token.span };\n }\n\n /** Asignación (`x = …`, `lista[i] += …`), incremento (`i++`) o expresión. */\n private parseSimpleStatement(): ast.Assignment | ast.Increment | ast.ExpressionStatement {\n const start = this.current.span.start;\n const expression = this.parseExpression(Precedence.LOWEST, true);\n const operator = ASSIGNMENT_OPERATORS[this.current.type];\n const increment = INCREMENT_OPERATORS[this.current.type];\n if (!operator && !increment) {\n return { kind: 'ExpressionStatement', id: this.id(), expression, span: this.spanFrom(start) };\n }\n if (expression.kind !== 'Identifier' && expression.kind !== 'Index') {\n this.error(\n 'ASIGNACIÓN_INVÁLIDA',\n increment\n ? `\\`${this.current.lexeme}\\` solo funciona con una variable o un elemento, como \\`i${this.current.lexeme}\\` o \\`lista[0]${this.current.lexeme}\\`.`\n : 'Solo se le puede asignar un valor a una variable o a un elemento, como `x = 1` o `lista[0] = 1`.',\n this.current.span,\n );\n }\n this.advance();\n if (increment) {\n return { kind: 'Increment', id: this.id(), target: expression, operator: increment, span: this.spanFrom(start) };\n }\n const value = this.parseExpression();\n if (value.kind === 'FunctionLiteral' && !value.name && expression.kind === 'Identifier') {\n value.name = expression.name;\n }\n return {\n kind: 'Assignment',\n id: this.id(),\n target: expression,\n operator: operator!,\n value,\n span: this.spanFrom(start),\n };\n }\n\n private parseReturn(): ast.Return {\n const keyword = this.advance();\n const endsHere =\n this.check(TokenType.SEMICOLON) ||\n this.check(TokenType.RBRACE) ||\n this.check(TokenType.EOF) ||\n this.current.span.start.line > keyword.span.end.line;\n const value = endsHere ? undefined : this.parseExpression();\n return { kind: 'Return', id: this.id(), value, span: this.spanFrom(keyword.span.start) };\n }\n\n private parseBlock(context: string): ast.Block {\n const open = this.expect(TokenType.LBRACE, context, 'Los bloques de Codexivo siempre van entre llaves `{ }`.');\n const statements = this.parseStatements(TokenType.RBRACE);\n if (!this.check(TokenType.RBRACE)) {\n this.error(\n 'BLOQUE_SIN_CERRAR',\n `Falta \\`}\\` para cerrar el bloque que empieza en la línea ${open.span.start.line}.`,\n open.span,\n );\n }\n this.advance();\n return { kind: 'Block', id: this.id(), statements, span: this.spanFrom(open.span.start) };\n }\n\n /** Analiza `parse` dentro de paréntesis, corchetes o llaves, donde los saltos de línea no terminan nada. */\n private grouped<T>(parse: () => T): T {\n this.grouping += 1;\n try {\n return parse();\n } finally {\n this.grouping -= 1;\n }\n }\n\n private parseCondition(keyword: string): ast.Expression {\n this.expect(\n TokenType.LPAREN,\n `después de \\`${keyword}\\``,\n `La condición va entre paréntesis: \\`${keyword} (x > 0)\\`.`,\n );\n const condition = this.grouped(() => this.parseExpression());\n this.expect(TokenType.RPAREN, `para cerrar la condición de \\`${keyword}\\``);\n return condition;\n }\n\n private parseIf(): ast.If {\n const start = this.current.span.start;\n const branches: ast.IfBranch[] = [];\n let keyword = 'si';\n do {\n const branchStart = this.advance().span.start; // si / pero_si\n const condition = this.parseCondition(keyword);\n const body = this.parseBlock(`después de la condición de \\`${keyword}\\``);\n branches.push({ condition, body, span: this.spanFrom(branchStart) });\n keyword = 'pero_si';\n } while (this.check(TokenType.ELSEIF));\n\n let alternative: ast.Block | undefined;\n if (this.match(TokenType.ELSE)) {\n if (this.check(TokenType.IF)) {\n this.error(\n 'SI_NO_SI',\n 'Después de `si_no` va directamente un bloque.',\n this.current.span,\n 'Para otra condición usa `pero_si (…)`.',\n );\n }\n alternative = this.parseBlock('después de `si_no`');\n }\n return { kind: 'If', id: this.id(), branches, alternative, span: this.spanFrom(start) };\n }\n\n private parseWhile(): ast.While {\n const start = this.advance().span.start;\n const condition = this.parseCondition('mientras');\n const body = this.parseLoopBody('después de la condición de `mientras`');\n return { kind: 'While', id: this.id(), condition, body, span: this.spanFrom(start) };\n }\n\n private parseDoUntil(): ast.DoUntil {\n const start = this.advance().span.start;\n const body = this.parseLoopBody('después de `hacer`');\n this.expect(\n TokenType.UNTIL,\n 'después del bloque de `hacer`',\n 'La forma completa es `hacer { … } hasta_que (condición)`.',\n );\n const condition = this.parseCondition('hasta_que');\n return { kind: 'DoUntil', id: this.id(), body, condition, span: this.spanFrom(start) };\n }\n\n private parseFor(): ast.For | ast.ForRange {\n const start = this.advance().span.start;\n // `para i desde …` cuenta; `para (…; …; …)` es la forma clásica.\n if (!this.check(TokenType.LPAREN)) return this.parseForRange(start);\n this.expect(\n TokenType.LPAREN,\n 'después de `para`',\n 'La forma completa es `para (variable i = 0; i < 10; i += 1) { … }`.',\n );\n\n const { init, condition, update } = this.grouped(() => {\n let init: ast.For['init'];\n if (!this.check(TokenType.SEMICOLON)) {\n if (this.check(TokenType.LET) || this.check(TokenType.CONST)) init = this.parseVariableDeclaration();\n else init = this.parseSimpleStatement();\n }\n this.expect(TokenType.SEMICOLON, 'después del inicio del `para`');\n\n const condition = this.check(TokenType.SEMICOLON) ? undefined : this.parseExpression();\n this.expect(TokenType.SEMICOLON, 'después de la condición del `para`');\n\n let update: ast.For['update'];\n if (!this.check(TokenType.RPAREN)) update = this.parseSimpleStatement();\n this.expect(TokenType.RPAREN, 'para cerrar el `para`');\n return { init, condition, update };\n });\n\n const body = this.parseLoopBody('después de `para (…)`');\n return { kind: 'For', id: this.id(), init, condition, update, body, span: this.spanFrom(start) };\n }\n\n private parseForRange(start: Position): ast.ForRange {\n const form = 'La forma completa es `para i desde 1 hasta 10 { … }`.';\n if (this.check(TokenType.LET)) {\n // Se salta `variable` para no reportar también la declaración incompleta.\n this.advance();\n this.error(\n 'TOKEN_ESPERADO',\n 'La variable de `para … desde … hasta` se escribe sin `variable`.',\n this.current.span,\n form,\n );\n }\n const variable = this.parseBindingName('después de `para`');\n if (this.check(TokenType.ASSIGN)) {\n this.error(\n 'TOKEN_ESPERADO',\n `Para contar se escribe \\`desde\\`, no \\`=\\`: \\`para ${variable.name} desde 1 hasta 10\\`.`,\n this.current.span,\n 'La forma clásica `para (variable i = 0; i < 10; i++)` va entre paréntesis.',\n );\n }\n // Un `{` justo después de `desde`, `hasta` o `con_paso` es el cuerpo, no un diccionario: falta el valor.\n const value = (after: string): ast.Expression => {\n if (this.check(TokenType.LBRACE)) {\n this.error('EXPRESIÓN_ESPERADA', `Falta un valor después de \\`${after}\\`.`, this.current.span, form);\n }\n return this.parseExpression();\n };\n this.expect(TokenType.FROM, `después de \\`para ${variable.name}\\``, form);\n const from = value('desde');\n this.expect(TokenType.TO, 'después del inicio del `para`', form);\n const to = value('hasta');\n const step = this.match(TokenType.STEP) ? value('con_paso') : undefined;\n const body = this.parseLoopBody('después de `para … desde … hasta …`');\n return { kind: 'ForRange', id: this.id(), variable, from, to, step, body, span: this.spanFrom(start) };\n }\n\n private parseRepeat(): ast.Repeat {\n const keyword = this.advance();\n if (this.check(TokenType.TIMES) || this.check(TokenType.LBRACE)) {\n this.error(\n 'REPETIR_SIN_CANTIDAD',\n 'Falta cuántas veces se repite.',\n this.current.span,\n 'La forma completa es `repetir 4 veces { … }`.',\n );\n }\n const count = this.parseExpression();\n this.expect(\n TokenType.TIMES,\n 'después de la cantidad de `repetir`',\n 'La forma completa es `repetir 4 veces { … }`.',\n );\n const body = this.parseLoopBody('después de `repetir … veces`');\n return { kind: 'Repeat', id: this.id(), count, body, span: this.spanFrom(keyword.span.start) };\n }\n\n private parseDomain(): ast.Domain {\n const keyword = this.advance();\n const name = this.parseBindingName('después de `dominio`');\n const open = this.expect(\n TokenType.LBRACE,\n `después de \\`dominio ${name.name}\\``,\n 'Lo que agrupa un dominio va entre llaves: `dominio calculadora { … }`.',\n );\n // Un dominio no está dentro de ningún bucle, aunque se escriba dentro de uno.\n const loopDepth = this.loopDepth;\n this.loopDepth = 0;\n let statements: ast.Statement[];\n try {\n statements = this.parseStatements(TokenType.RBRACE);\n } finally {\n this.loopDepth = loopDepth;\n }\n if (!this.check(TokenType.RBRACE)) {\n this.error(\n 'BLOQUE_SIN_CERRAR',\n `Falta \\`}\\` para cerrar el dominio que empieza en la línea ${open.span.start.line}.`,\n open.span,\n );\n }\n this.advance();\n for (const statement of statements) {\n if (DOMAIN_MEMBERS.has(statement.kind) || this.errors.length >= MAX_ERRORS) continue;\n this.errors.push(\n new CodexivoError({\n kind: 'sintaxis',\n code: 'DOMINIO_SOLO_DECLARACIONES',\n message: printStart(statement)\n ? `Un dominio solo agrupa declaraciones, y \\`${printStart(statement)}\\` no es una.`\n : 'Un dominio solo agrupa declaraciones, y esta sentencia no es una.',\n hint: 'Dentro de `dominio` van `variable`, `constante`, `procedimiento` u otro `dominio`. Lo demás va en un procedimiento o fuera del dominio.',\n span: statement.span,\n }),\n );\n }\n const body: ast.Block = { kind: 'Block', id: this.id(), statements, span: this.spanFrom(open.span.start) };\n return { kind: 'Domain', id: this.id(), name, body, span: this.spanFrom(keyword.span.start) };\n }\n\n private parseForEach(): ast.ForEach {\n const keyword = this.advance();\n const form = 'La forma completa es `para_cada fruta en frutas { … }`, sin paréntesis.';\n if (this.check(TokenType.LPAREN)) {\n this.error('TOKEN_ESPERADO', '`para_cada` no lleva paréntesis.', this.current.span, form);\n }\n const variable = this.parseBindingName('después de `para_cada`');\n let value: ast.Identifier | undefined;\n if (this.match(TokenType.COMMA)) {\n value = this.parseBindingName(`después de \\`para_cada ${variable.name},\\``);\n if (value.name === variable.name) {\n this.error('PARÁMETRO_REPETIDO', `La variable \\`${value.name}\\` está repetida.`, value.span);\n }\n }\n const names = value ? `${variable.name}, ${value.name}` : variable.name;\n this.expect(TokenType.IN, `después de \\`para_cada ${names}\\``, form);\n const iterable = this.parseExpression();\n const body = this.parseLoopBody('después de `para_cada … en …`');\n return {\n kind: 'ForEach',\n id: this.id(),\n variable,\n value,\n iterable,\n body,\n span: this.spanFrom(keyword.span.start),\n };\n }\n\n /** El cuerpo de un bucle: ahí sí se puede usar `romper` y `continuar`. */\n private parseLoopBody(context: string): ast.Block {\n this.loopDepth += 1;\n try {\n return this.parseBlock(context);\n } finally {\n this.loopDepth -= 1;\n }\n }\n\n private parseLoopJump(): ast.Break | ast.Continue {\n const token = this.advance();\n const kind = token.type === TokenType.BREAK ? 'Break' : 'Continue';\n if (this.loopDepth === 0) {\n this.error(\n kind === 'Break' ? 'ROMPER_FUERA_DE_BUCLE' : 'CONTINUAR_FUERA_DE_BUCLE',\n `\\`${token.lexeme}\\` solo se puede usar dentro de un bucle.`,\n token.span,\n kind === 'Break'\n ? 'Para salir de un procedimiento usa `regresa`.'\n : 'Dentro de un procedimiento, `continuar` no afecta al bucle desde donde se llamó.',\n );\n }\n return { kind, id: this.id(), span: token.span };\n }\n\n // ── expresiones ────────────────────────────────────────────────────────────\n\n /** `statement` indica que la expresión es una sentencia completa, donde `i++` sí está permitido. */\n private parseExpression(precedence: Precedence = Precedence.LOWEST, statement = false): ast.Expression {\n this.enter();\n let left = this.parsePrefix();\n while (precedence < (INFIX_PRECEDENCE[this.current.type] ?? Precedence.LOWEST)) {\n // Sin `;`, una línea que empieza con `-`, `(` o `[` es otra sentencia, no la continuación de la anterior.\n if (this.grouping === 0 && this.current.span.start.line > this.previous.span.end.line) break;\n left = this.parseInfix(left);\n }\n if (!statement && INCREMENT_OPERATORS[this.current.type]) this.incrementInExpression(left);\n this.leave();\n return left;\n }\n\n private incrementInExpression(left?: ast.Expression): never {\n const operator = this.current.lexeme;\n const name = left?.kind === 'Identifier' ? left.name : 'i';\n this.error(\n 'INCREMENTO_EN_EXPRESIÓN',\n `\\`${operator}\\` es una sentencia: va sola, justo después del nombre de una variable.`,\n this.current.span,\n left?.kind === 'Identifier' || !left\n ? `Escribe \\`${name}${operator}\\` en su propia línea y después usa \\`${name}\\`.`\n : `Escribe el \\`${operator}\\` en su propia línea, antes o después de usar el valor.`,\n );\n }\n\n private parsePrefix(): ast.Expression {\n const token = this.current;\n switch (token.type) {\n case TokenType.NUMBER:\n this.advance();\n return { kind: 'NumberLiteral', id: this.id(), value: token.value as number, span: token.span };\n case TokenType.STRING:\n this.advance();\n return { kind: 'StringLiteral', id: this.id(), value: token.value as string, span: token.span };\n case TokenType.TRUE:\n case TokenType.FALSE:\n this.advance();\n return { kind: 'BooleanLiteral', id: this.id(), value: token.type === TokenType.TRUE, span: token.span };\n case TokenType.NULL:\n this.advance();\n return { kind: 'NullLiteral', id: this.id(), span: token.span };\n case TokenType.IDENT:\n this.advance();\n return { kind: 'Identifier', id: this.id(), name: token.lexeme, span: token.span };\n case TokenType.LPAREN: {\n this.advance();\n const expression = this.grouped(() => this.parseExpression());\n this.expect(TokenType.RPAREN, 'para cerrar el paréntesis');\n return expression;\n }\n case TokenType.LBRACKET:\n return this.parseList();\n case TokenType.LBRACE:\n return this.parseDict();\n case TokenType.MINUS: {\n this.advance();\n const operand = this.parseExpression(Precedence.UNARY);\n return { kind: 'Unary', id: this.id(), operator: '-', operand, span: this.spanFrom(token.span.start) };\n }\n case TokenType.NOT:\n case TokenType.BANG: {\n this.advance();\n const operand = this.parseExpression(Precedence.NOT);\n return { kind: 'Unary', id: this.id(), operator: 'no', operand, span: this.spanFrom(token.span.start) };\n }\n case TokenType.FUNCTION:\n if (this.peek().type === TokenType.IDENT) {\n this.error(\n 'PROCEDIMIENTO_CON_NOMBRE',\n 'Un procedimiento con nombre es una sentencia; no puede ir dentro de una expresión.',\n this.peek().span,\n 'Como valor, escríbelo sin nombre: `variable doble = procedimiento(x) { … }`.',\n );\n }\n return this.parseFunction(this.advance().span.start);\n case TokenType.INCREMENT:\n case TokenType.DECREMENT:\n if (this.peek().type === TokenType.IDENT) {\n const name = this.peek().lexeme;\n this.error(\n 'INCREMENTO_EN_EXPRESIÓN',\n `En Codexivo \\`${token.lexeme}\\` va después del nombre de la variable.`,\n { start: token.span.start, end: this.peek().span.end },\n `Escribe \\`${name}${token.lexeme}\\` como una sentencia propia.`,\n );\n }\n this.incrementInExpression();\n case TokenType.ILLEGAL:\n throw new ParseFailure();\n case TokenType.IF:\n case TokenType.WHILE:\n case TokenType.FOR:\n case TokenType.DO:\n case TokenType.LET:\n case TokenType.CONST:\n case TokenType.DOMAIN:\n case TokenType.REPEAT:\n case TokenType.FOR_EACH:\n case TokenType.BREAK:\n case TokenType.CONTINUE:\n case TokenType.RETURN:\n this.error(\n 'SENTENCIA_EN_EXPRESIÓN',\n `${describeToken(token)} empieza una sentencia y no se puede usar dentro de una expresión.`,\n token.span,\n );\n case TokenType.EOF:\n this.error(\n 'EXPRESIÓN_INCOMPLETA',\n 'El programa terminó a mitad de una expresión.',\n token.span,\n 'Revisa que no falte un valor al final.',\n );\n default:\n this.error(\n 'EXPRESIÓN_ESPERADA',\n `Se esperaba un valor, pero se encontró ${describeToken(token)}.`,\n token.span,\n /^[a-z_]+$/.test(token.lexeme)\n ? `\\`${token.lexeme}\\` es una palabra reservada; no se puede usar como nombre de variable.`\n : undefined,\n );\n }\n }\n\n private parseInfix(left: ast.Expression): ast.Expression {\n const token = this.current;\n const start = left.span.start;\n switch (token.type) {\n case TokenType.LPAREN: {\n this.advance();\n const args = this.parseList_(TokenType.RPAREN, 'para cerrar los argumentos');\n return { kind: 'Call', id: this.id(), callee: left, args, span: this.spanFrom(start) };\n }\n case TokenType.LBRACKET: {\n this.advance();\n if (this.check(TokenType.RBRACKET)) {\n this.error(\n 'ÍNDICE_VACÍO',\n 'Falta el índice entre los corchetes.',\n this.current.span,\n 'Por ejemplo: `lista[0]`.',\n );\n }\n const index = this.grouped(() => this.parseExpression());\n this.expect(TokenType.RBRACKET, 'para cerrar el índice');\n return { kind: 'Index', id: this.id(), object: left, index, span: this.spanFrom(start) };\n }\n case TokenType.DOT: {\n this.advance();\n const property = this.current;\n if (property.type !== TokenType.IDENT) {\n this.failSilentlyOnIllegal();\n // Una palabra reservada como `si` no debe empezar otra sentencia al recuperarse del error.\n if (property.type !== TokenType.EOF) this.advance();\n this.error(\n 'CAMPO_ESPERADO',\n `Después de \\`.\\` va el nombre de un campo, pero se encontró ${describeToken(property)}.`,\n property.span,\n 'Con `.` solo se usan claves que son nombres válidos; para las demás escribe `d[\"clave\"]`.',\n );\n }\n this.advance();\n const index: ast.StringLiteral = {\n kind: 'StringLiteral',\n id: this.id(),\n value: property.lexeme,\n span: property.span,\n };\n return { kind: 'Index', id: this.id(), object: left, index, dot: true, span: this.spanFrom(start) };\n }\n case TokenType.AND:\n case TokenType.OR: {\n this.advance();\n const precedence = INFIX_PRECEDENCE[token.type]!;\n const right = this.parseExpression(precedence);\n const operator = token.type === TokenType.AND ? 'y' : 'o';\n return { kind: 'Logical', id: this.id(), operator, left, right, span: this.spanFrom(start) };\n }\n default: {\n this.advance();\n const precedence = INFIX_PRECEDENCE[token.type]!;\n // `^` es asociativo a la derecha: `2 ^ 3 ^ 2` es `2 ^ (3 ^ 2)`.\n const right = this.parseExpression(precedence === Precedence.POWER ? precedence - 1 : precedence);\n const operator = BINARY_OPERATORS[token.type]!;\n if (precedence === Precedence.COMPARE && INFIX_PRECEDENCE[this.current.type] === Precedence.COMPARE) {\n this.error(\n 'COMPARACIÓN_ENCADENADA',\n 'No se pueden encadenar comparaciones.',\n { start, end: this.current.span.end },\n 'Une las dos comparaciones con `y`, por ejemplo: `1 < x y x < 5`.',\n );\n }\n return { kind: 'Binary', id: this.id(), operator, left, right, span: this.spanFrom(start) };\n }\n }\n }\n\n private parseList(): ast.ListLiteral {\n const start = this.advance().span.start;\n const elements = this.parseList_(TokenType.RBRACKET, 'para cerrar la lista');\n return { kind: 'ListLiteral', id: this.id(), elements, span: this.spanFrom(start) };\n }\n\n private parseDict(): ast.DictLiteral {\n const open = this.advance();\n const entries: ast.DictEntry[] = [];\n const literalKeys = new Set<string | number>();\n while (!this.check(TokenType.RBRACE)) {\n const entryStart = this.current.span.start;\n if (this.check(TokenType.IDENT) && this.peek().type === TokenType.COLON) {\n this.error(\n 'CLAVE_SIN_COMILLAS',\n `La clave \\`${this.current.lexeme}\\` necesita comillas.`,\n this.current.span,\n `Escribe \\`\"${this.current.lexeme}\": …\\`. Si querías usar el valor de una variable como clave, ponla entre paréntesis: \\`(${this.current.lexeme}): …\\`.`,\n );\n }\n const key = this.grouped(() => this.parseExpression());\n this.expect(TokenType.COLON, 'después de la clave', 'Cada elemento de un diccionario se escribe `clave: valor`.');\n const value = this.grouped(() => this.parseExpression());\n if (key.kind === 'StringLiteral' || key.kind === 'NumberLiteral') {\n if (literalKeys.has(key.value)) {\n this.error('CLAVE_REPETIDA', `La clave ${describeKey(key.value)} está repetida.`, key.span);\n }\n literalKeys.add(key.value);\n if (value.kind === 'FunctionLiteral' && !value.name && key.kind === 'StringLiteral') value.name = key.value;\n }\n entries.push({ key, value, span: this.spanFrom(entryStart) });\n if (!this.match(TokenType.COMMA)) break;\n }\n if (!this.check(TokenType.RBRACE)) {\n this.failSilentlyOnIllegal();\n this.error(\n 'TOKEN_ESPERADO',\n `Se esperaba \\`,\\` o \\`}\\` en el diccionario que empieza en la línea ${open.span.start.line}, pero se encontró ${describeToken(this.current)}.`,\n this.current.span,\n );\n }\n this.advance();\n return { kind: 'DictLiteral', id: this.id(), entries, span: this.spanFrom(open.span.start) };\n }\n\n /** Expresiones separadas por comas hasta `closing`. Se permite una coma final. */\n private parseList_(closing: TokenType, context: string): ast.Expression[] {\n const items: ast.Expression[] = [];\n while (!this.check(closing)) {\n items.push(this.grouped(() => this.parseExpression()));\n if (!this.match(TokenType.COMMA)) break;\n }\n this.expect(closing, context);\n return items;\n }\n\n private parseFunctionDeclaration(): ast.FunctionDeclaration {\n const start = this.advance().span.start;\n const name = this.parseBindingName('después de `procedimiento`');\n const fn = this.parseFunction(start, name.name);\n return { kind: 'FunctionDeclaration', id: this.id(), name, function: fn, span: fn.span };\n }\n\n /** Parámetros y cuerpo; `procedimiento` (y el nombre, si lo hay) ya se leyeron. */\n private parseFunction(start: Position, name?: string): ast.FunctionLiteral {\n this.expect(\n TokenType.LPAREN,\n 'después de `procedimiento`',\n 'Los parámetros van entre paréntesis: `procedimiento(a, b) { … }`.',\n );\n const params: ast.Identifier[] = [];\n const seen = new Set<string>();\n while (!this.check(TokenType.RPAREN)) {\n const param = this.parseBindingName('como parámetro');\n if (seen.has(param.name)) {\n this.error('PARÁMETRO_REPETIDO', `El parámetro \\`${param.name}\\` está repetido.`, param.span);\n }\n seen.add(param.name);\n params.push(param);\n if (!this.match(TokenType.COMMA)) break;\n }\n this.expect(TokenType.RPAREN, 'para cerrar los parámetros');\n // `romper` y `continuar` no cruzan los límites de un procedimiento.\n const loopDepth = this.loopDepth;\n this.loopDepth = 0;\n let body: ast.Block;\n try {\n body = this.parseBlock('para el cuerpo del procedimiento');\n } finally {\n this.loopDepth = loopDepth;\n }\n return { kind: 'FunctionLiteral', id: this.id(), name, params, body, span: this.spanFrom(start) };\n }\n}\n\nconst describeKey = (key: string | number): string => (typeof key === 'string' ? JSON.stringify(key) : String(key));\n",
|
|
9
9
|
"import type * as ast from '../syntax/ast';\nimport type { Value } from './values';\n\nexport type DecisionLabel = 'si' | 'pero_si' | 'mientras' | 'hasta_que' | 'para' | 'repetir' | 'para_cada';\n\n/**\n * Instrucciones de la máquina de Codexivo. Cada una conserva el nodo del AST que la originó, así la\n * máquina puede decir qué parte del código está ejecutando y dónde ocurrió un error.\n */\nexport type Instruction =\n /** Inicio de una sentencia: punto natural para pausar. */\n | { op: 'step'; node: ast.Statement }\n | { op: 'const'; value: Value; node: ast.Node }\n | { op: 'list'; count: number; node: ast.ListLiteral }\n /** Saca `count` pares clave–valor de la pila y crea un diccionario. */\n | { op: 'dict'; count: number; node: ast.DictLiteral }\n | { op: 'load'; name: string; node: ast.Identifier; forUpdate?: boolean }\n /**\n * Saca un valor de la pila y crea la variable (o constante) `target` en el alcance actual. `node` es la\n * sentencia que la declara: una declaración, un procedimiento con nombre o la variable de un `para_cada`.\n */\n | {\n op: 'declare';\n name: string;\n constant: boolean;\n target: ast.Identifier;\n node: ast.Node;\n /** La variable de un `para … desde … hasta`: avanza sola y no se puede cambiar en el cuerpo. */\n loop?: boolean;\n }\n /** Saca un valor de la pila y lo guarda en una variable existente. */\n | { op: 'store'; name: string; target: ast.Identifier; node: ast.Assignment | ast.Increment }\n /** Saca valor, índice (o clave) y lista (o diccionario), en ese orden, y cambia el elemento. */\n | { op: 'setIndex'; target: ast.Index; node: ast.Assignment | ast.Increment }\n /** Copia los `count` valores de la cima de la pila. */\n | { op: 'dup'; count: number }\n /** Saca `count` valores de la pila (los valores ocultos de un bucle al salir con `romper`). */\n | { op: 'pop'; count: number }\n /** Saca un valor de la pila; es el valor de una sentencia de expresión. */\n | { op: 'result'; node: ast.ExpressionStatement }\n | { op: 'unary'; operator: ast.UnaryOperator; node: ast.Unary }\n | { op: 'binary'; operator: ast.BinaryOperator; node: ast.Binary | ast.Assignment | ast.Increment }\n | { op: 'index'; node: ast.Index }\n | { op: 'closure'; chunk: Chunk; node: ast.FunctionLiteral }\n | { op: 'call'; argc: number; node: ast.Call }\n | { op: 'return'; hasValue: boolean; node: ast.Return }\n | { op: 'jump'; target: number }\n /** Saca la condición (debe ser lógica) y salta si vale `jumpWhen`. */\n | {\n op: 'branch';\n target: number;\n jumpWhen: boolean;\n label: DecisionLabel;\n node: ast.Expression;\n owner: ast.Statement;\n }\n /** Revisa que la cantidad de `repetir` (en la cima de la pila) sea un entero ≥ 0; queda como contador oculto. */\n | { op: 'repeatStart'; node: ast.Expression; owner: ast.Repeat }\n /** Si al contador le quedan vueltas, lo reduce y sigue; si no, lo saca de la pila y salta a `target`. */\n | { op: 'repeatNext'; target: number; node: ast.Expression; owner: ast.Repeat }\n /**\n * Revisa lo que se recorre y deja tres valores ocultos en la pila: lo recorrido, su longitud (o, en un\n * diccionario, la lista de sus claves al empezar) y la posición 0.\n */\n | { op: 'forEachStart'; node: ast.Expression; owner: ast.ForEach }\n /**\n * Saca inicio, final y paso de la pila, los revisa y deja cuatro valores ocultos: el inicio, el paso, la\n * cantidad de vueltas y la vuelta actual.\n */\n | { op: 'rangeStart'; explicitStep: boolean; owner: ast.ForRange }\n /** Si quedan vueltas, pone el siguiente valor en la pila; si no, saca los valores ocultos y salta a `target`. */\n | { op: 'rangeNext'; target: number; node: ast.Expression; owner: ast.ForRange }\n /**\n * Si quedan elementos, pone el siguiente en la pila (en un diccionario, la clave; o el valor y luego la\n * clave si hay dos variables); si no, saca los valores ocultos y salta a `target`.\n */\n | { op: 'forEachNext'; target: number; node: ast.Expression; owner: ast.ForEach }\n /** Cortocircuito: revisa el lado izquierdo de `y`/`o`; si ya decide el resultado, lo deja y salta. */\n | { op: 'shortCircuit'; target: number; node: ast.Logical }\n /** Revisa que el lado derecho de `y`/`o` sea lógico. */\n | { op: 'checkLogical'; node: ast.Logical }\n /** Abre el alcance de un `dominio`: ahí se declaran sus miembros. */\n | { op: 'domainStart' }\n /** Cierra el alcance del dominio, lo convierte en un valor y lo declara (como constante) afuera. */\n | { op: 'domainEnd'; name: string; writable: string[]; node: ast.Domain }\n | { op: 'enterScope' }\n | { op: 'exitScope' }\n | { op: 'halt' };\n\n/** Código de un procedimiento o del programa principal. */\nexport interface Chunk {\n name: string;\n params: string[];\n code: Instruction[];\n node: ast.Program | ast.FunctionLiteral;\n /**\n * Código de la biblioteca escrito en Codexivo (`prelude.ts`). Sus pasos no pausan, no emiten eventos ni\n * cuentan operaciones: la llamada se cobra según la tabla de costos, y sus errores se ubican en la llamada.\n */\n hidden?: boolean;\n /** Parámetros obligatorios, si son menos que `params` (los demás llegan como `nulo`). Solo en la biblioteca. */\n minParams?: number;\n}\n\n/** Traduce el AST a instrucciones. El AST debe venir sin errores de sintaxis. */\nexport const compile = (program: ast.Program): Chunk => {\n const compiler = new Compiler({ name: 'programa', params: [], code: [], node: program }, false);\n compiler.statements(program.statements);\n compiler.emit({ op: 'halt' });\n return compiler.chunk;\n};\n\n/** Compila un procedimiento. `hidden` marca el código de la biblioteca (ver `Chunk.hidden`). */\nexport const compileProcedure = (node: ast.FunctionLiteral, hidden = false): Chunk => {\n const chunk: Chunk = {\n name: node.name ?? 'procedimiento',\n params: node.params.map(param => param.name),\n code: [],\n node,\n };\n if (hidden) chunk.hidden = true;\n const compiler = new Compiler(chunk, hidden);\n // El cuerpo comparte alcance con los parámetros: así `variable x` dentro de `procedimiento(x)` es un error.\n compiler.statements(node.body.statements);\n compiler.emit({ op: 'const', value: null, node });\n compiler.emit({ op: 'return', hasValue: true, node: { kind: 'Return', id: node.id, span: node.body.span } });\n return compiler.chunk;\n};\n\n/** Operador que aplica cada asignación compuesta. */\nconst COMPOUND_OPERATORS: Record<Exclude<ast.AssignmentOperator, '='>, ast.BinaryOperator> = {\n '+=': '+',\n '-=': '-',\n '*=': '*',\n '/=': '/',\n '%=': 'mod',\n};\n\n/** Un bucle abierto: a dónde saltan `romper` y `continuar`, y qué hay que limpiar antes. */\ninterface Loop {\n breaks: number[];\n continues: number[];\n /** Alcances abiertos en el punto al que llegan los saltos. */\n scopeDepth: number;\n /** Valores ocultos del bucle en la pila (el contador de `repetir`, el estado de `para_cada`). */\n slots: number;\n}\n\nclass Compiler {\n private scopeDepth = 0;\n private readonly loops: Loop[] = [];\n\n constructor(\n readonly chunk: Chunk,\n private readonly hidden: boolean,\n ) {}\n\n emit(instruction: Instruction): number {\n this.chunk.code.push(instruction);\n return this.chunk.code.length - 1;\n }\n\n private get here(): number {\n return this.chunk.code.length;\n }\n\n private patch(at: number, target: number): void {\n const instruction = this.chunk.code[at];\n if (instruction && 'target' in instruction) instruction.target = target;\n }\n\n private enterScope(): void {\n this.emit({ op: 'enterScope' });\n this.scopeDepth += 1;\n }\n\n private exitScope(): void {\n this.emit({ op: 'exitScope' });\n this.scopeDepth -= 1;\n }\n\n /** Las sentencias de un bloque. Los procedimientos con nombre se crean antes que todo lo demás. */\n statements(statements: ast.Statement[]): void {\n for (const statement of statements) {\n if (statement.kind !== 'FunctionDeclaration') continue;\n this.emit({ op: 'closure', chunk: compileProcedure(statement.function, this.hidden), node: statement.function });\n this.emit({\n op: 'declare',\n name: statement.name.name,\n constant: false,\n target: statement.name,\n node: statement,\n });\n }\n for (const statement of statements) this.statement(statement);\n }\n\n /** Abre un bucle, compila su cuerpo y regresa los saltos de `romper` y `continuar` para conectarlos. */\n private loop(slots: number, body: () => void): Loop {\n const loop: Loop = { breaks: [], continues: [], scopeDepth: this.scopeDepth, slots };\n this.loops.push(loop);\n body();\n this.loops.pop();\n return loop;\n }\n\n private connect(jumps: number[], target: number): void {\n for (const jump of jumps) this.patch(jump, target);\n }\n\n statement(node: ast.Statement): void {\n if (node.kind === 'FunctionDeclaration') return; // ya se declaró al entrar al bloque\n if (node.kind !== 'Block') this.emit({ op: 'step', node });\n switch (node.kind) {\n case 'VariableDeclaration':\n this.expression(node.value);\n this.emit({ op: 'declare', name: node.name.name, constant: node.constant, target: node.name, node });\n return;\n case 'Assignment':\n case 'Increment':\n this.assignment(node);\n return;\n case 'ExpressionStatement':\n this.expression(node.expression);\n this.emit({ op: 'result', node });\n return;\n case 'Return':\n if (node.value) this.expression(node.value);\n this.emit({ op: 'return', hasValue: Boolean(node.value), node });\n return;\n case 'Block':\n this.block(node);\n return;\n case 'Domain':\n this.emit({ op: 'domainStart' });\n this.scopeDepth += 1;\n this.statements(node.body.statements);\n this.scopeDepth -= 1;\n this.emit({\n op: 'domainEnd',\n name: node.name.name,\n writable: node.body.statements.flatMap(member =>\n member.kind === 'VariableDeclaration' && !member.constant ? [member.name.name] : [],\n ),\n node,\n });\n return;\n case 'Break':\n case 'Continue': {\n const loop = this.loops[this.loops.length - 1]!;\n // El código que sigue nunca se ejecuta, así que la cuenta de alcances no cambia.\n for (let depth = this.scopeDepth; depth > loop.scopeDepth; depth--) this.emit({ op: 'exitScope' });\n if (node.kind === 'Break') {\n if (loop.slots > 0) this.emit({ op: 'pop', count: loop.slots });\n loop.breaks.push(this.emit({ op: 'jump', target: -1 }));\n } else {\n loop.continues.push(this.emit({ op: 'jump', target: -1 }));\n }\n return;\n }\n case 'If': {\n const exits: number[] = [];\n node.branches.forEach((branch, index) => {\n this.expression(branch.condition);\n const skip = this.emit({\n op: 'branch',\n target: -1,\n jumpWhen: false,\n label: index === 0 ? 'si' : 'pero_si',\n node: branch.condition,\n owner: node,\n });\n this.block(branch.body);\n exits.push(this.emit({ op: 'jump', target: -1 }));\n this.patch(skip, this.here);\n });\n if (node.alternative) this.block(node.alternative);\n for (const exit of exits) this.patch(exit, this.here);\n return;\n }\n case 'While': {\n const start = this.here;\n this.expression(node.condition);\n const exit = this.emit({\n op: 'branch',\n target: -1,\n jumpWhen: false,\n label: 'mientras',\n node: node.condition,\n owner: node,\n });\n const loop = this.loop(0, () => this.block(node.body));\n this.emit({ op: 'jump', target: start });\n this.patch(exit, this.here);\n this.connect(loop.continues, start);\n this.connect(loop.breaks, this.here);\n return;\n }\n case 'DoUntil': {\n const start = this.here;\n const loop = this.loop(0, () => this.block(node.body));\n this.connect(loop.continues, this.here);\n this.expression(node.condition);\n this.emit({\n op: 'branch',\n target: start,\n jumpWhen: false,\n label: 'hasta_que',\n node: node.condition,\n owner: node,\n });\n this.connect(loop.breaks, this.here);\n return;\n }\n case 'For': {\n this.enterScope();\n if (node.init) this.statement(node.init);\n const start = this.here;\n let exit = -1;\n if (node.condition) {\n this.expression(node.condition);\n exit = this.emit({\n op: 'branch',\n target: -1,\n jumpWhen: false,\n label: 'para',\n node: node.condition,\n owner: node,\n });\n }\n const loop = this.loop(0, () => this.block(node.body));\n this.connect(loop.continues, this.here);\n if (node.update) this.statement(node.update);\n this.emit({ op: 'jump', target: start });\n if (exit >= 0) this.patch(exit, this.here);\n this.connect(loop.breaks, this.here);\n this.exitScope();\n return;\n }\n case 'Repeat': {\n this.expression(node.count);\n this.emit({ op: 'repeatStart', node: node.count, owner: node });\n const start = this.here;\n const exit = this.emit({ op: 'repeatNext', target: -1, node: node.count, owner: node });\n const loop = this.loop(1, () => this.block(node.body));\n this.emit({ op: 'jump', target: start });\n this.patch(exit, this.here);\n this.connect(loop.continues, start);\n this.connect(loop.breaks, this.here);\n return;\n }\n case 'ForRange': {\n this.expression(node.from);\n this.expression(node.to);\n if (node.step) this.expression(node.step);\n else this.emit({ op: 'const', value: 1, node });\n this.emit({ op: 'rangeStart', explicitStep: Boolean(node.step), owner: node });\n const start = this.here;\n const exit = this.emit({ op: 'rangeNext', target: -1, node: node.to, owner: node });\n const loop = this.loop(4, () => {\n // Como en `para_cada`, la variable es nueva en cada vuelta y comparte alcance con el cuerpo.\n this.enterScope();\n this.emit({\n op: 'declare',\n name: node.variable.name,\n constant: false,\n loop: true,\n target: node.variable,\n node: node.variable,\n });\n this.statements(node.body.statements);\n this.exitScope();\n });\n this.emit({ op: 'jump', target: start });\n this.patch(exit, this.here);\n this.connect(loop.continues, start);\n this.connect(loop.breaks, this.here);\n return;\n }\n case 'ForEach': {\n this.expression(node.iterable);\n this.emit({ op: 'forEachStart', node: node.iterable, owner: node });\n const start = this.here;\n const exit = this.emit({ op: 'forEachNext', target: -1, node: node.iterable, owner: node });\n const loop = this.loop(3, () => {\n // La variable del bucle es nueva en cada vuelta y comparte alcance con el cuerpo.\n this.enterScope();\n for (const variable of [node.variable, ...(node.value ? [node.value] : [])]) {\n this.emit({ op: 'declare', name: variable.name, constant: false, target: variable, node: variable });\n }\n this.statements(node.body.statements);\n this.exitScope();\n });\n this.emit({ op: 'jump', target: start });\n this.patch(exit, this.here);\n this.connect(loop.continues, start);\n this.connect(loop.breaks, this.here);\n return;\n }\n }\n }\n\n private assignment(node: ast.Assignment | ast.Increment): void {\n const operator =\n node.kind === 'Increment'\n ? node.operator === '++'\n ? '+'\n : '-'\n : node.operator === '='\n ? undefined\n : COMPOUND_OPERATORS[node.operator];\n const value = () => {\n if (node.kind === 'Increment') this.emit({ op: 'const', value: 1, node: node.target });\n else this.expression(node.value);\n };\n const { target } = node;\n\n if (target.kind === 'Identifier') {\n if (operator) this.emit({ op: 'load', name: target.name, node: target, forUpdate: true });\n value();\n if (operator) this.emit({ op: 'binary', operator, node });\n this.emit({ op: 'store', name: target.name, target, node });\n return;\n }\n\n this.expression(target.object);\n this.expression(target.index);\n if (operator) {\n this.emit({ op: 'dup', count: 2 });\n this.emit({ op: 'index', node: target });\n }\n value();\n if (operator) this.emit({ op: 'binary', operator, node });\n this.emit({ op: 'setIndex', target, node });\n }\n\n private block(node: ast.Block): void {\n this.enterScope();\n this.statements(node.statements);\n this.exitScope();\n }\n\n private expression(node: ast.Expression): void {\n switch (node.kind) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n this.emit({ op: 'const', value: node.value, node });\n return;\n case 'NullLiteral':\n this.emit({ op: 'const', value: null, node });\n return;\n case 'ListLiteral':\n for (const element of node.elements) this.expression(element);\n this.emit({ op: 'list', count: node.elements.length, node });\n return;\n case 'DictLiteral':\n for (const entry of node.entries) {\n this.expression(entry.key);\n this.expression(entry.value);\n }\n this.emit({ op: 'dict', count: node.entries.length, node });\n return;\n case 'Identifier':\n this.emit({ op: 'load', name: node.name, node });\n return;\n case 'Unary':\n this.expression(node.operand);\n this.emit({ op: 'unary', operator: node.operator, node });\n return;\n case 'Binary':\n this.expression(node.left);\n this.expression(node.right);\n this.emit({ op: 'binary', operator: node.operator, node });\n return;\n case 'Logical': {\n this.expression(node.left);\n const skip = this.emit({ op: 'shortCircuit', target: -1, node });\n this.expression(node.right);\n this.emit({ op: 'checkLogical', node });\n this.patch(skip, this.here);\n return;\n }\n case 'Call':\n this.expression(node.callee);\n for (const arg of node.args) this.expression(arg);\n this.emit({ op: 'call', argc: node.args.length, node });\n return;\n case 'Index':\n this.expression(node.object);\n this.expression(node.index);\n this.emit({ op: 'index', node });\n return;\n case 'FunctionLiteral':\n this.emit({ op: 'closure', chunk: compileProcedure(node, this.hidden), node });\n return;\n }\n }\n}\n",
|
|
10
|
-
"import type { CodexivoError } from '../errors';\nimport type { RobotEvent } from '../world';\nimport type { Chunk } from './compiler';\n\n/**\n * Valores en tiempo de ejecución. Números, textos, lógicos y `nulo` son primitivos de JavaScript;\n * listas y procedimientos son objetos con un `id` para poder dibujar cuándo dos variables\n * comparten el mismo valor.\n */\nexport type Value =\n number | string | boolean | null | ListValue | DictValue | DomainValue | ProcedureValue | NativeValue;\n\nexport interface ListValue {\n kind: 'lista';\n id: number;\n items: Value[];\n}\n\n/** Clave de un diccionario: un texto o un número. */\nexport type DictKey = string | number;\n\n/** Diccionario: conserva el orden en que se agregaron las claves. */\nexport interface DictValue {\n kind: 'diccionario';\n id: number;\n entries: Map<DictKey, Value>;\n}\n\n/**\n * Un `dominio`: un espacio de nombres. Sus miembros son las variables de `scope`; desde fuera se usan con `.` y\n * solo se pueden cambiar los que se declararon con `variable` (`writable`).\n */\nexport interface DomainValue {\n kind: 'dominio';\n id: number;\n name: string;\n scope: Scope;\n writable: ReadonlySet<string>;\n}\n\nexport interface ProcedureValue {\n kind: 'procedimiento';\n id: number;\n name?: string;\n chunk: Chunk;\n closure: Scope;\n}\n\n/** Contexto que la máquina le da a los procedimientos nativos. */\nexport interface NativeContext {\n write(text: string): void;\n /** Siguiente línea de entrada, `null` si ya no hay, o `WAIT_FOR_INPUT` si hay que pedirla. */\n readLine(): string | null | typeof WAIT_FOR_INPUT;\n newList(items: Value[]): ListValue;\n newDict(entries: Map<DictKey, Value>): DictValue;\n /** Número pseudoaleatorio en [0, 1) del generador con semilla de la máquina. */\n random(): number;\n /** Error de ejecución ubicado en la llamada actual. */\n fail(code: string, message: string, hint?: string): CodexivoError;\n /** Emite un evento propio del procedimiento (el modo mundo emite `robot`), ubicado en la llamada actual. */\n emit(event: RobotEvent): void;\n}\n\nexport const WAIT_FOR_INPUT: unique symbol = Symbol('esperar-entrada');\n\nexport type ProcedureLevel = 'principiante' | 'intermedio' | 'avanzado';\n\nexport type ProcedureCategory =\n | 'entrada y salida'\n | 'tipos'\n | 'matemáticas'\n | 'texto'\n | 'listas'\n | 'diccionarios'\n | 'procedimientos'\n | 'estructuras'\n | 'mundo';\n\n/** Ejemplo ejecutable de un procedimiento: `result` es el valor final como se escribiría en código. */\nexport interface ProcedureExample {\n code: string;\n result?: string;\n output?: string;\n}\n\n/** Documentación de un procedimiento de la biblioteca; de aquí sale el catálogo (`catalog.ts`). */\nexport interface ProcedureDoc {\n level: ProcedureLevel;\n category: ProcedureCategory;\n /** Tipos con los nombres de `tipo(x)`, `cualquiera`, o varios separados por ` | `. */\n params: Array<{ name: string; type: string; optional?: boolean }>;\n /** `true` si el último parámetro se puede repetir (`imprimir(a, b, …)`). */\n variadic?: boolean;\n /** Lo que regresa; `nulo` si no regresa nada útil. */\n returns: string;\n /** `true` si cambia su primer argumento. */\n mutates?: boolean;\n description: string;\n examples: ProcedureExample[];\n}\n\nexport interface NativeValue {\n kind: 'nativo';\n name: string;\n /** Documentación para el catálogo. Los nativos internos de la biblioteca no la tienen. */\n doc?: ProcedureDoc;\n /** Cantidad de argumentos: exacta, o `[mínimo, máximo]` (`máximo` puede ser `Infinity`). */\n arity: number | [number, number];\n call(args: Value[], context: NativeContext): Value | typeof WAIT_FOR_INPUT;\n /**\n * Cuántas operaciones debería costar una llamada con estos argumentos (§10). Sin `cost`, cuesta 1.\n * Se registra aquí para que la tabla de costos viva junto a cada procedimiento.\n */\n cost?: (args: Value[]) => number;\n}\n\nexport type TypeName = 'número' | 'texto' | 'lógico' | 'nulo' | 'lista' | 'diccionario' | 'dominio' | 'procedimiento';\n\nexport const typeOf = (value: Value): TypeName => {\n if (value === null) return 'nulo';\n switch (typeof value) {\n case 'number':\n return 'número';\n case 'string':\n return 'texto';\n case 'boolean':\n return 'lógico';\n default:\n return value.kind === 'lista' || value.kind === 'diccionario' || value.kind === 'dominio'\n ? value.kind\n : 'procedimiento';\n }\n};\n\n/** \"un número\", \"una lista\"… para mensajes. */\nexport const describeType = (type: TypeName): string => {\n switch (type) {\n case 'lista':\n return 'una lista';\n case 'nulo':\n return '`nulo`';\n default:\n return `un ${type}`;\n }\n};\n\nexport const isList = (value: Value): value is ListValue =>\n typeof value === 'object' && value !== null && value.kind === 'lista';\n\nexport const isDomain = (value: Value): value is DomainValue =>\n typeof value === 'object' && value !== null && value.kind === 'dominio';\n\nexport const isDict = (value: Value): value is DictValue =>\n typeof value === 'object' && value !== null && value.kind === 'diccionario';\n\nexport const isCallable = (value: Value): value is ProcedureValue | NativeValue =>\n typeof value === 'object' && value !== null && (value.kind === 'procedimiento' || value.kind === 'nativo');\n\nconst formatNumber = (value: number): string => {\n if (Object.is(value, -0)) return '0';\n if (value === Infinity) return 'infinito';\n if (value === -Infinity) return '-infinito';\n return String(value);\n};\n\n/** Representación como se escribiría en código: los textos van entre comillas. */\nexport const repr = (value: Value, seen: Set<ListValue | DictValue> = new Set()): string => {\n if (value === null) return 'nulo';\n switch (typeof value) {\n case 'number':\n return formatNumber(value);\n case 'string':\n return JSON.stringify(value);\n case 'boolean':\n return value ? 'verdadero' : 'falso';\n }\n if (value.kind === 'dominio') return `dominio ${value.name}`;\n if (value.kind === 'lista' || value.kind === 'diccionario') {\n if (seen.has(value)) return value.kind === 'lista' ? '[…]' : '{…}';\n seen.add(value);\n const inner =\n value.kind === 'lista'\n ? value.items.map(item => repr(item, seen))\n : [...value.entries].map(([key, item]) => `${repr(key)}: ${repr(item, seen)}`);\n seen.delete(value);\n return value.kind === 'lista' ? `[${inner.join(', ')}]` : `{${inner.join(', ')}}`;\n }\n return value.name ? `procedimiento ${value.name}` : 'procedimiento';\n};\n\n/** Como lo muestra `imprimir`: los textos sin comillas. */\nexport const show = (value: Value): string => (typeof value === 'string' ? value : repr(value));\n\ntype Container = ListValue | DictValue;\n\n/**\n * Igualdad por valor: dos listas son iguales si tienen los mismos elementos en el mismo orden, y dos\n * diccionarios si tienen las mismas claves con los mismos valores, en cualquier orden.\n */\nexport const equals = (a: Value, b: Value, seen: Array<[Container, Container]> = []): boolean => {\n if (a === b) return true;\n const bothLists = isList(a) && isList(b);\n const bothDicts = isDict(a) && isDict(b);\n if (!bothLists && !bothDicts) return false;\n if (seen.some(([x, y]) => x === a && y === b)) return true;\n seen.push([a as Container, b as Container]);\n let result: boolean;\n if (bothLists) {\n const [x, y] = [a as ListValue, b as ListValue];\n result = x.items.length === y.items.length && x.items.every((item, index) => equals(item, y.items[index]!, seen));\n } else {\n const [x, y] = [a as DictValue, b as DictValue];\n result =\n x.entries.size === y.entries.size &&\n [...x.entries].every(([key, item]) => y.entries.has(key) && equals(item, y.entries.get(key)!, seen));\n }\n seen.pop();\n return result;\n};\n\n/**\n * Un alcance: las variables de un bloque. `parent` apunta al alcance que lo contiene.\n */\nexport class Scope {\n readonly variables = new Map<string, Value>();\n /** Nombres de este alcance declarados con `constante`. */\n readonly constants = new Set<string>();\n /** Variables de `para … desde … hasta` en este alcance: avanzan solas. */\n readonly loopVariables = new Set<string>();\n\n constructor(readonly parent?: Scope) {}\n\n lookup(name: string): Scope | undefined {\n let scope: Scope | undefined = this;\n while (scope) {\n if (scope.variables.has(name)) return scope;\n scope = scope.parent;\n }\n return undefined;\n }\n}\n",
|
|
10
|
+
"import type { CodexivoError } from '../errors';\nimport type { RobotEvent } from '../world';\nimport type { Chunk } from './compiler';\n\n/**\n * Valores en tiempo de ejecución. Números, textos, lógicos y `nulo` son primitivos de JavaScript;\n * listas y procedimientos son objetos con un `id` para poder dibujar cuándo dos variables\n * comparten el mismo valor.\n */\nexport type Value =\n number | string | boolean | null | ListValue | DictValue | DomainValue | ProcedureValue | NativeValue;\n\nexport interface ListValue {\n kind: 'lista';\n id: number;\n items: Value[];\n}\n\n/** Clave de un diccionario: un texto o un número. */\nexport type DictKey = string | number;\n\n/** Diccionario: conserva el orden en que se agregaron las claves. */\nexport interface DictValue {\n kind: 'diccionario';\n id: number;\n entries: Map<DictKey, Value>;\n}\n\n/**\n * Un `dominio`: un espacio de nombres. Sus miembros son las variables de `scope`; desde fuera se usan con `.` y\n * solo se pueden cambiar los que se declararon con `variable` (`writable`).\n */\nexport interface DomainValue {\n kind: 'dominio';\n id: number;\n name: string;\n scope: Scope;\n writable: ReadonlySet<string>;\n}\n\nexport interface ProcedureValue {\n kind: 'procedimiento';\n id: number;\n name?: string;\n chunk: Chunk;\n closure: Scope;\n}\n\n/** Contexto que la máquina le da a los procedimientos nativos. */\nexport interface NativeContext {\n write(text: string): void;\n /** Siguiente línea de entrada, `null` si ya no hay, o `WAIT_FOR_INPUT` si hay que pedirla. */\n readLine(): string | null | typeof WAIT_FOR_INPUT;\n newList(items: Value[]): ListValue;\n newDict(entries: Map<DictKey, Value>): DictValue;\n /** Número pseudoaleatorio en [0, 1) del generador con semilla de la máquina. */\n random(): number;\n /** Error de ejecución ubicado en la llamada actual. */\n fail(code: string, message: string, hint?: string): CodexivoError;\n /** Emite un evento propio del procedimiento (el modo mundo emite `robot`), ubicado en la llamada actual. */\n emit(event: RobotEvent): void;\n}\n\nexport const WAIT_FOR_INPUT: unique symbol = Symbol('esperar-entrada');\n\nexport type ProcedureLevel = 'principiante' | 'intermedio' | 'avanzado';\n\nexport type ProcedureCategory =\n | 'entrada y salida'\n | 'tipos'\n | 'verificación'\n | 'matemáticas'\n | 'texto'\n | 'listas'\n | 'diccionarios'\n | 'procedimientos'\n | 'estructuras'\n | 'mundo';\n\n/** Ejemplo ejecutable de un procedimiento: `result` es el valor final como se escribiría en código. */\nexport interface ProcedureExample {\n code: string;\n result?: string;\n output?: string;\n}\n\n/** Documentación de un procedimiento de la biblioteca; de aquí sale el catálogo (`catalog.ts`). */\nexport interface ProcedureDoc {\n level: ProcedureLevel;\n category: ProcedureCategory;\n /** Tipos con los nombres de `tipo(x)`, `cualquiera`, o varios separados por ` | `. */\n params: Array<{ name: string; type: string; optional?: boolean }>;\n /** `true` si el último parámetro se puede repetir (`imprimir(a, b, …)`). */\n variadic?: boolean;\n /** Lo que regresa; `nulo` si no regresa nada útil. */\n returns: string;\n /** `true` si cambia su primer argumento. */\n mutates?: boolean;\n description: string;\n examples: ProcedureExample[];\n}\n\nexport interface NativeValue {\n kind: 'nativo';\n name: string;\n /** Documentación para el catálogo. Los nativos internos de la biblioteca no la tienen. */\n doc?: ProcedureDoc;\n /** Cantidad de argumentos: exacta, o `[mínimo, máximo]` (`máximo` puede ser `Infinity`). */\n arity: number | [number, number];\n call(args: Value[], context: NativeContext): Value | typeof WAIT_FOR_INPUT;\n /**\n * Cuántas operaciones debería costar una llamada con estos argumentos (§10). Sin `cost`, cuesta 1.\n * Se registra aquí para que la tabla de costos viva junto a cada procedimiento.\n */\n cost?: (args: Value[]) => number;\n}\n\nexport type TypeName = 'número' | 'texto' | 'lógico' | 'nulo' | 'lista' | 'diccionario' | 'dominio' | 'procedimiento';\n\nexport const typeOf = (value: Value): TypeName => {\n if (value === null) return 'nulo';\n switch (typeof value) {\n case 'number':\n return 'número';\n case 'string':\n return 'texto';\n case 'boolean':\n return 'lógico';\n default:\n return value.kind === 'lista' || value.kind === 'diccionario' || value.kind === 'dominio'\n ? value.kind\n : 'procedimiento';\n }\n};\n\n/** \"un número\", \"una lista\"… para mensajes. */\nexport const describeType = (type: TypeName): string => {\n switch (type) {\n case 'lista':\n return 'una lista';\n case 'nulo':\n return '`nulo`';\n default:\n return `un ${type}`;\n }\n};\n\nexport const isList = (value: Value): value is ListValue =>\n typeof value === 'object' && value !== null && value.kind === 'lista';\n\nexport const isDomain = (value: Value): value is DomainValue =>\n typeof value === 'object' && value !== null && value.kind === 'dominio';\n\nexport const isDict = (value: Value): value is DictValue =>\n typeof value === 'object' && value !== null && value.kind === 'diccionario';\n\nexport const isCallable = (value: Value): value is ProcedureValue | NativeValue =>\n typeof value === 'object' && value !== null && (value.kind === 'procedimiento' || value.kind === 'nativo');\n\nconst formatNumber = (value: number): string => {\n if (Object.is(value, -0)) return '0';\n if (value === Infinity) return 'infinito';\n if (value === -Infinity) return '-infinito';\n return String(value);\n};\n\n/** Representación como se escribiría en código: los textos van entre comillas. */\nexport const repr = (value: Value, seen: Set<ListValue | DictValue> = new Set()): string => {\n if (value === null) return 'nulo';\n switch (typeof value) {\n case 'number':\n return formatNumber(value);\n case 'string':\n return JSON.stringify(value);\n case 'boolean':\n return value ? 'verdadero' : 'falso';\n }\n if (value.kind === 'dominio') return `dominio ${value.name}`;\n if (value.kind === 'lista' || value.kind === 'diccionario') {\n if (seen.has(value)) return value.kind === 'lista' ? '[…]' : '{…}';\n seen.add(value);\n const inner =\n value.kind === 'lista'\n ? value.items.map(item => repr(item, seen))\n : [...value.entries].map(([key, item]) => `${repr(key)}: ${repr(item, seen)}`);\n seen.delete(value);\n return value.kind === 'lista' ? `[${inner.join(', ')}]` : `{${inner.join(', ')}}`;\n }\n return value.name ? `procedimiento ${value.name}` : 'procedimiento';\n};\n\n/** Como lo muestra `imprimir`: los textos sin comillas. */\nexport const show = (value: Value): string => (typeof value === 'string' ? value : repr(value));\n\ntype Container = ListValue | DictValue;\n\n/**\n * Igualdad por valor: dos listas son iguales si tienen los mismos elementos en el mismo orden, y dos\n * diccionarios si tienen las mismas claves con los mismos valores, en cualquier orden.\n */\nexport const equals = (a: Value, b: Value, seen: Array<[Container, Container]> = []): boolean => {\n if (a === b) return true;\n const bothLists = isList(a) && isList(b);\n const bothDicts = isDict(a) && isDict(b);\n if (!bothLists && !bothDicts) return false;\n if (seen.some(([x, y]) => x === a && y === b)) return true;\n seen.push([a as Container, b as Container]);\n let result: boolean;\n if (bothLists) {\n const [x, y] = [a as ListValue, b as ListValue];\n result = x.items.length === y.items.length && x.items.every((item, index) => equals(item, y.items[index]!, seen));\n } else {\n const [x, y] = [a as DictValue, b as DictValue];\n result =\n x.entries.size === y.entries.size &&\n [...x.entries].every(([key, item]) => y.entries.has(key) && equals(item, y.entries.get(key)!, seen));\n }\n seen.pop();\n return result;\n};\n\n/**\n * Un alcance: las variables de un bloque. `parent` apunta al alcance que lo contiene.\n */\nexport class Scope {\n readonly variables = new Map<string, Value>();\n /** Nombres de este alcance declarados con `constante`. */\n readonly constants = new Set<string>();\n /** Variables de `para … desde … hasta` en este alcance: avanzan solas. */\n readonly loopVariables = new Set<string>();\n\n constructor(readonly parent?: Scope) {}\n\n lookup(name: string): Scope | undefined {\n let scope: Scope | undefined = this;\n while (scope) {\n if (scope.variables.has(name)) return scope;\n scope = scope.parent;\n }\n return undefined;\n }\n}\n",
|
|
11
11
|
"import { isDict, isList } from './values';\nimport type { Value } from './values';\n\n/**\n * Cuántas operaciones cuesta cada procedimiento de la biblioteca (§10). Es la única tabla de costos: la\n * usan los nativos de `builtins.ts` y los procedimientos de `prelude.ts`, y los retos del sitio comparan\n * soluciones con estas cifras. Un procedimiento que no aparece aquí cuesta 1, como cualquier operación.\n *\n * `n` es el tamaño (caracteres, elementos o claves) del primer argumento.\n */\nexport type Cost = (args: Value[]) => number;\n\n/** Tamaño de un texto, lista o diccionario; 1 para lo demás. */\nexport const sizeOf = (value: Value | undefined): number => {\n if (typeof value === 'string') return value.length;\n if (value !== undefined && isList(value)) return value.items.length;\n if (value !== undefined && isDict(value)) return value.entries.size;\n return 1;\n};\n\n/** `n`: recorre su primer argumento una vez. */\nconst linear: Cost = args => Math.max(1, sizeOf(args[0]));\n\n/** `n · ⌈log₂ n⌉`: lo que cuesta ordenar `n` elementos. */\nconst nLogN: Cost = args => {\n const n = sizeOf(args[0]);\n return Math.max(1, n * Math.ceil(Math.log2(Math.max(n, 1))));\n};\n\n/** Cuesta tantas casillas como crea. */\nconst creates =\n (count: (args: Value[]) => number): Cost =>\n args =>\n Math.max(1, Math.ceil(count(args)));\n\n/** `n` de `máximo(…)` y `mínimo(…)`, que reciben varios números o una lista. */\nconst values: Cost = args => (args.length === 1 ? linear(args) : Math.max(1, args.length));\n\n/** Largo del texto o lista que se busca (segundo argumento). */\nconst searched: Cost = args => Math.max(1, sizeOf(args[1]));\n\nconst slice: Cost = args =>\n typeof args[1] === 'number' && typeof args[2] === 'number' ? Math.max(1, Math.abs(args[2] - args[1])) : 1;\n\nconst range: Cost = args => {\n const [start, end, step = 1] = args;\n if (typeof start !== 'number' || typeof end !== 'number' || typeof step !== 'number' || step === 0) return 1;\n return Math.max(1, Math.floor((end - start) / step) + 1);\n};\n\nexport const COSTS: Readonly<Partial<Record<string, Cost>>> = {\n // matemáticas\n máximo: values,\n mínimo: values,\n\n // texto\n mayúsculas: linear,\n minúsculas: linear,\n recortar: linear,\n dividir: linear,\n unir: linear,\n reemplazar: linear,\n contiene: linear,\n posición_de: linear,\n empieza_con: searched,\n termina_con: searched,\n subtexto: slice,\n caracteres: linear,\n invertir: linear,\n\n // listas\n insertar: linear,\n quitar: linear,\n quitar_primero: linear,\n desencolar: linear,\n rebanar: slice,\n copiar: linear,\n sumar: linear,\n ordenar: nLogN,\n rango: range,\n índices: linear,\n lista_de: creates(args => (typeof args[0] === 'number' ? args[0] * sizeOf(args[1]) : 1)),\n matriz: creates(args => (typeof args[0] === 'number' && typeof args[1] === 'number' ? args[0] * args[1] : 1)),\n\n // diccionarios\n claves: linear,\n valores: linear,\n\n // procedimientos como valores: además, cada llamada a `f` cuesta lo que cueste su cuerpo\n mapear: linear,\n filtrar: linear,\n reducir: linear,\n alguno: linear,\n todos: linear,\n buscar: linear,\n};\n",
|
|
12
|
-
"import { describeType, isCallable, isDict, isList, repr, show, typeOf, WAIT_FOR_INPUT } from './values';\nimport { COSTS } from './costs';\nimport { equals } from './values';\nimport type { DictValue, ListValue, NativeContext, NativeValue, ProcedureDoc, Value } from './values';\n\ntype NativeFn = (args: Value[], context: NativeContext) => Value | typeof WAIT_FOR_INPUT;\n\n/**\n * Define un procedimiento de la biblioteca. La documentación es obligatoria: de ahí sale el catálogo que usan el\n * sitio, el editor y las pruebas. El costo vive en `costs.ts`, en una sola tabla.\n */\nconst define = (name: string, arity: NativeValue['arity'], doc: ProcedureDoc, call: NativeFn): NativeValue => {\n const cost = COSTS[name];\n return { kind: 'nativo', name, arity, call, doc, ...(cost ? { cost } : {}) };\n};\n\n/** Un nativo que solo ve la biblioteca escrita en Codexivo: no se documenta porque el programa no lo ve. */\nconst internal = (name: string, arity: NativeValue['arity'], call: NativeFn): NativeValue => ({\n kind: 'nativo',\n name,\n arity,\n call,\n});\n\nconst expectNumber = (name: string, value: Value, context: NativeContext, position = ''): number => {\n if (typeof value === 'number') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un número${position}, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n );\n};\n\nconst expectList = (name: string, value: Value, context: NativeContext) => {\n if (isList(value)) return value;\n throw context.fail('TIPO_DE_ARGUMENTO', `\\`${name}\\` espera una lista, pero recibió ${describeType(typeOf(value))}.`);\n};\n\nconst expectText = (name: string, value: Value, context: NativeContext, position = ''): string => {\n if (typeof value === 'string') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un texto${position}, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n );\n};\n\nconst expectInteger = (name: string, value: Value, context: NativeContext, position = ''): number => {\n const number = expectNumber(name, value, context, position);\n if (Number.isInteger(number)) return number;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un número entero${position}, pero recibió ${repr(number)}.`,\n 'Redondea el valor con `redondear(…)`, `piso(…)` o `techo(…)`.',\n );\n};\n\nconst expectCount = (name: string, value: Value, context: NativeContext, position = ''): number => {\n const count = expectInteger(name, value, context, position);\n if (count >= 0 && count <= MAX_RANGE) return count;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n count < 0\n ? `\\`${name}\\` necesita una cantidad de 0 o más${position}, pero recibió ${count}.`\n : `\\`${name}\\` produciría ${count} elementos; el máximo es ${MAX_RANGE}.`,\n );\n};\n\n/** Mismo mensaje que el operador `[ ]` cuando el índice no cabe. */\nconst outOfRange = (index: number, length: number, list: boolean, context: NativeContext) => {\n const what = list ? 'la lista' : 'el texto';\n const unit = list ? (length === 1 ? 'elemento' : 'elementos') : length === 1 ? 'carácter' : 'caracteres';\n return context.fail(\n 'ÍNDICE_FUERA_DE_RANGO',\n `El índice ${index} está fuera de ${what}, que tiene ${length} ${unit}.`,\n length === 0\n ? list\n ? 'La lista está vacía.'\n : 'El texto está vacío.'\n : `Los índices válidos van de 0 a ${length - 1} (o de -1 a -${length} desde el final).`,\n );\n};\n\n/**\n * Posición real de `value` en algo de longitud `length`. Los negativos cuentan desde el final. Con\n * `allowEnd`, `length` también vale (para `insertar` al final o como fin de `rebanar`).\n */\nconst positionIn = (\n name: string,\n value: Value,\n length: number,\n list: boolean,\n context: NativeContext,\n allowEnd = false,\n): number => {\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw context.fail('ÍNDICE_INVÁLIDO', `\\`${name}\\` necesita un índice entero, pero recibió ${repr(value)}.`);\n }\n const position = value < 0 ? length + value : value;\n if (position < 0 || position > length || (position === length && !allowEnd)) {\n throw outOfRange(value, length, list, context);\n }\n return position;\n};\n\n/** Copia una lista o un diccionario y todo lo que contiene, para no compartir casillas por accidente. */\nconst deepCopy = (value: Value, context: NativeContext, copies = new Map<Value, Value>()): Value => {\n if (!isList(value) && !isDict(value)) return value;\n const done = copies.get(value);\n if (done) return done;\n if (isList(value)) {\n const copy = context.newList([]);\n copies.set(value, copy);\n for (const item of value.items) copy.items.push(deepCopy(item, context, copies));\n return copy;\n }\n const copy = context.newDict(new Map());\n copies.set(value, copy);\n for (const [key, item] of value.entries) copy.entries.set(key, deepCopy(item, context, copies));\n return copy;\n};\n\nconst emptyListError = (name: string, context: NativeContext) =>\n context.fail('LISTA_VACÍA', `\\`${name}\\` no puede tomar nada de una lista vacía.`);\n\n/** Para `contiene` y `posición_de`, que con una lista ya se resolvieron: el valor tiene que ser un texto. */\nconst expectTextOrList = (name: string, value: Value, context: NativeContext): string => {\n if (typeof value === 'string') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un texto o una lista, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\n/** Inicio y fin (sin incluirlo) de `subtexto` y `rebanar`, con la misma convención que `[ ]`. */\nconst sliceBounds = (\n name: string,\n args: Value[],\n length: number,\n list: boolean,\n context: NativeContext,\n): [number, number] => {\n const start = positionIn(name, args[1]!, length, list, context, true);\n const end = positionIn(name, args[2]!, length, list, context, true);\n if (start > end) {\n throw context.fail(\n 'RANGO_INVÁLIDO',\n `\\`${name}\\` necesita que el inicio (${repr(args[1]!)}) no esté después del fin (${repr(args[2]!)}).`,\n 'El fin no se incluye: `subtexto(\"hola\", 1, 3)` es `\"ol\"`.',\n );\n }\n return [start, end];\n};\n\n/** Compara para `ordenar`: todos números o todos textos. */\nconst sortableKind = (list: ListValue, context: NativeContext): 'número' | 'texto' => {\n const first = list.items[0];\n const kind = typeof first === 'string' ? 'texto' : 'número';\n for (const item of list.items) {\n if (typeOf(item) !== kind) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`ordenar\\` necesita que todos los elementos sean números o todos textos, pero encontró ${describeType(typeOf(item))} (${repr(item)}).`,\n );\n }\n }\n return kind;\n};\n\n/** Una pila o una cola es una lista; los mensajes usan su propio vocabulario. */\nconst expectStructure = (name: string, kind: 'pila' | 'cola', value: Value, context: NativeContext): ListValue => {\n if (isList(value)) return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera una ${kind} (una lista), pero recibió ${describeType(typeOf(value))}.`,\n `Una ${kind} empieza como una lista vacía: \\`variable ${kind} = [];\\`.`,\n );\n};\n\nconst emptyStructure = (name: string, kind: 'pila' | 'cola', context: NativeContext) =>\n context.fail(\n kind === 'pila' ? 'PILA_VACÍA' : 'COLA_VACÍA',\n name === 'tope' || name === 'frente'\n ? `Una ${kind} vacía no tiene \\`${name}\\`.`\n : `No se puede \\`${name}\\` de una ${kind} vacía.`,\n `Revisa antes con \\`longitud(${kind}) > 0\\`.`,\n );\n\nconst expectDict = (name: string, value: Value, context: NativeContext): DictValue => {\n if (isDict(value)) return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un diccionario, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\nconst expectKey = (name: string, value: Value, context: NativeContext): string | number => {\n if (typeof value === 'string' || typeof value === 'number') return value;\n throw context.fail(\n 'CLAVE_INVÁLIDA',\n `\\`${name}\\` espera una clave de texto o número, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\nconst numbersOf = (name: string, args: Value[], context: NativeContext): number[] => {\n const values = args.length === 1 && isList(args[0]!) ? args[0].items : args;\n if (values.length === 0) {\n throw context.fail('LISTA_VACÍA', `\\`${name}\\` necesita al menos un número, pero la lista está vacía.`);\n }\n return values.map(value => expectNumber(name, value, context));\n};\n\nconst parseNumber = (text: string): number | undefined => {\n const trimmed = text.trim();\n if (!/^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)$/.test(trimmed)) return undefined;\n return Number(trimmed);\n};\n\n/** Redondeo escolar: los .5 se alejan del cero (2.5 → 3, -2.5 → -3). */\nconst roundHalfAway = (value: number, decimals: number): number => {\n const factor = 10 ** decimals;\n return (Math.sign(value) * Math.round(Math.abs(value) * factor)) / factor;\n};\n\n/** Más elementos que esto en una lista creada de golpe es casi siempre un error, y llenaría la memoria. */\nconst MAX_RANGE = 10_000_000;\n\nconst library: NativeValue[] = [\n // entrada y salida\n define(\n 'imprimir',\n [0, Infinity],\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [{ name: 'valor', type: 'cualquiera', optional: true }],\n variadic: true,\n returns: 'nulo',\n description:\n 'Escribe los valores separados por un espacio y termina la línea. Los textos se escriben sin comillas.',\n examples: [{ code: 'imprimir(\"Hola,\", \"Ana\", 16)', output: 'Hola, Ana 16\\n' }],\n },\n (args, context) => {\n context.write(`${args.map(show).join(' ')}\\n`);\n return null;\n },\n ),\n define(\n 'leer',\n 0,\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [],\n returns: 'texto | nulo',\n description: 'Lee la siguiente línea de entrada como texto. Si ya no hay más entrada, regresa `nulo`.',\n examples: [{ code: 'leer()', result: 'nulo' }],\n },\n (_args, context) => context.readLine(),\n ),\n define(\n 'leer_número',\n 0,\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [],\n returns: 'número',\n description: 'Lee la siguiente línea de entrada y la convierte en número. Si no es un número, es un error.',\n examples: [{ code: 'variable edad = 0\\nsi (falso) { edad = leer_número() }\\nedad', result: '0' }],\n },\n (_args, context) => {\n const line = context.readLine();\n if (line === WAIT_FOR_INPUT) return line;\n if (line === null) throw context.fail('SIN_ENTRADA', '`leer_número` no encontró más datos de entrada.');\n const value = parseNumber(line);\n if (value === undefined) {\n throw context.fail('NO_ES_NÚMERO', `\\`leer_número\\` esperaba un número, pero leyó ${JSON.stringify(line)}.`);\n }\n return value;\n },\n ),\n\n // tipos y conversiones\n define(\n 'tipo',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'cualquiera' }],\n returns: 'texto',\n description:\n 'El nombre del tipo de un valor: \"número\", \"texto\", \"lógico\", \"nulo\", \"lista\", \"diccionario\", \"dominio\" o \"procedimiento\".',\n examples: [\n { code: 'tipo(3.5)', result: '\"número\"' },\n { code: 'tipo([1, 2])', result: '\"lista\"' },\n ],\n },\n args => typeOf(args[0]!),\n ),\n define(\n 'texto',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'cualquiera' }],\n returns: 'texto',\n description: 'Convierte cualquier valor en texto, como lo escribiría `imprimir`.',\n examples: [{ code: 'texto(42) + \"!\"', result: '\"42!\"' }],\n },\n args => show(args[0]!),\n ),\n define(\n 'número',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'texto | número' }],\n returns: 'número',\n description: 'Convierte un texto en número. Si el texto no es un número, es un error.',\n examples: [{ code: 'número(\"3.5\") * 2', result: '7' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = parseNumber(value);\n if (parsed !== undefined) return parsed;\n throw context.fail('NO_ES_NÚMERO', `No se puede convertir ${JSON.stringify(value)} en número.`);\n }\n throw context.fail('TIPO_DE_ARGUMENTO', `No se puede convertir ${describeType(typeOf(value))} en número.`);\n },\n ),\n define(\n 'longitud',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'texto | lista | diccionario' }],\n returns: 'número',\n description: 'Cuántos caracteres tiene un texto, cuántos elementos una lista o cuántas claves un diccionario.',\n examples: [\n { code: 'longitud(\"año\")', result: '3' },\n { code: 'longitud([1, 2, 3])', result: '3' },\n ],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'string') return [...value].length;\n if (isList(value)) return value.items.length;\n if (isDict(value)) return value.entries.size;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`longitud\\` espera un texto, una lista o un diccionario, pero recibió ${describeType(typeOf(value))}.`,\n );\n },\n ),\n\n // matemáticas\n define(\n 'absoluto',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'El valor absoluto: la distancia del número al 0.',\n examples: [{ code: 'absoluto(-3)', result: '3' }],\n },\n (args, context) => Math.abs(expectNumber('absoluto', args[0]!, context)),\n ),\n define(\n 'máximo',\n [1, Infinity],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'números', type: 'número | lista' }],\n variadic: true,\n returns: 'número',\n description: 'El mayor de varios números, o de los números de una lista.',\n examples: [\n { code: 'máximo(3, 9, 2)', result: '9' },\n { code: 'máximo([4, 1])', result: '4' },\n ],\n },\n (args, context) => Math.max(...numbersOf('máximo', args, context)),\n ),\n define(\n 'mínimo',\n [1, Infinity],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'números', type: 'número | lista' }],\n variadic: true,\n returns: 'número',\n description: 'El menor de varios números, o de los números de una lista.',\n examples: [{ code: 'mínimo(3, 9, 2)', result: '2' }],\n },\n (args, context) => Math.min(...numbersOf('mínimo', args, context)),\n ),\n define(\n 'redondear',\n [1, 2],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [\n { name: 'x', type: 'número' },\n { name: 'decimales', type: 'número', optional: true },\n ],\n returns: 'número',\n description: 'Redondea al entero más cercano, o a cierta cantidad de decimales. Los .5 se alejan del cero.',\n examples: [\n { code: 'redondear(2.5)', result: '3' },\n { code: 'redondear(3.14159, 2)', result: '3.14' },\n ],\n },\n (args, context) => {\n const value = expectNumber('redondear', args[0]!, context);\n const decimals = args.length > 1 ? expectNumber('redondear', args[1]!, context, ' de decimales') : 0;\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n 'La cantidad de decimales de `redondear` tiene que ser un entero positivo o 0.',\n );\n }\n return roundHalfAway(value, decimals);\n },\n ),\n\n // listas\n define(\n 'agregar',\n 2,\n {\n level: 'principiante',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Agrega `x` al final de la lista.',\n examples: [{ code: 'variable l = [1]\\nagregar(l, 2)\\nl', result: '[1, 2]' }],\n },\n (args, context) => {\n expectList('agregar', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'rango',\n [2, 3],\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n { name: 'paso', type: 'número', optional: true },\n ],\n returns: 'lista',\n description: 'Lista de números de `inicio` a `fin`, incluyendo `fin`. Con un paso negativo cuenta hacia abajo.',\n examples: [\n { code: 'rango(1, 5)', result: '[1, 2, 3, 4, 5]' },\n { code: 'rango(10, 0, -5)', result: '[10, 5, 0]' },\n ],\n },\n (args, context) => {\n const start = expectNumber('rango', args[0]!, context, ' como inicio');\n const end = expectNumber('rango', args[1]!, context, ' como final');\n const step = args.length > 2 ? expectNumber('rango', args[2]!, context, ' como paso') : 1;\n if (step === 0) {\n throw context.fail(\n 'RANGO_PASO_CERO',\n 'El paso de `rango` no puede ser 0: nunca llegaría al final.',\n 'Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n );\n }\n // Se tolera un error de redondeo pequeño para que `rango(0, 1, 0.1)` incluya el 1.\n const count = Math.floor((end - start) / step + 1e-9) + 1;\n if (!Number.isFinite(count)) throw context.fail('TIPO_DE_ARGUMENTO', '`rango` necesita números finitos.');\n if (count > MAX_RANGE) {\n throw context.fail(\n 'RANGO_DEMASIADO_GRANDE',\n `\\`rango\\` produciría ${count} números; el máximo es ${MAX_RANGE}.`,\n 'Revisa el inicio, el final y el paso.',\n );\n }\n return context.newList(Array.from({ length: Math.max(0, count) }, (_, index) => start + index * step));\n },\n ),\n define(\n 'índices',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | texto' }],\n returns: 'lista',\n description: 'Las posiciones válidas de una lista o texto, de 0 a `longitud - 1`.',\n examples: [{ code: 'índices([\"a\", \"b\", \"c\"])', result: '[0, 1, 2]' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value !== 'string' && !isList(value)) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`índices\\` espera una lista o un texto, pero recibió ${describeType(typeOf(value))}.`,\n );\n }\n const length = typeof value === 'string' ? value.length : value.items.length;\n return context.newList(Array.from({ length }, (_, index) => index));\n },\n ),\n define(\n 'quitar',\n 2,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista | diccionario' },\n { name: 'posición', type: 'número | texto' },\n ],\n returns: 'cualquiera',\n mutates: true,\n description:\n 'Quita el elemento en esa posición de una lista, o esa clave de un diccionario, y regresa lo que quitó.',\n examples: [\n { code: 'variable l = [1, 2, 3]\\n[quitar(l, 0), l]', result: '[1, [2, 3]]' },\n { code: 'variable d = { \"a\": 1 }\\n[quitar(d, \"a\"), d]', result: '[1, {}]' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isDict(container)) {\n const key = expectKey('quitar', args[1]!, context);\n if (!container.entries.has(key)) {\n throw context.fail(\n 'CLAVE_INEXISTENTE',\n `\\`quitar\\` no encontró la clave ${repr(key)} en el diccionario.`,\n `Usa \\`tiene(d, ${repr(key)})\\` para preguntar antes de quitarla.`,\n );\n }\n const value = container.entries.get(key)!;\n container.entries.delete(key);\n return value;\n }\n if (!isList(container)) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`quitar\\` espera una lista o un diccionario, pero recibió ${describeType(typeOf(container))}.`,\n );\n }\n const index = args[1]!;\n if (typeof index !== 'number' || !Number.isInteger(index)) {\n throw context.fail('ÍNDICE_INVÁLIDO', `El índice tiene que ser un número entero, pero es ${repr(index)}.`);\n }\n const length = container.items.length;\n const position = index < 0 ? length + index : index;\n if (position < 0 || position >= length) {\n throw context.fail(\n 'ÍNDICE_FUERA_DE_RANGO',\n `El índice ${index} está fuera de la lista, que tiene ${length} ${length === 1 ? 'elemento' : 'elementos'}.`,\n length === 0\n ? 'La lista está vacía.'\n : `Los índices válidos van de 0 a ${length - 1} (o de -1 a -${length} desde el final).`,\n );\n }\n return container.items.splice(position, 1)[0]!;\n },\n ),\n define(\n 'primero',\n 1,\n {\n level: 'principiante',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El primer elemento de la lista.',\n examples: [{ code: 'primero([7, 8, 9])', result: '7' }],\n },\n (args, context) => {\n const list = expectList('primero', args[0]!, context);\n if (list.items.length === 0)\n throw context.fail('LISTA_VACÍA', '`primero` no puede tomar nada de una lista vacía.');\n return list.items[0]!;\n },\n ),\n define(\n 'último',\n 1,\n {\n level: 'principiante',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El último elemento de la lista.',\n examples: [{ code: 'último([7, 8, 9])', result: '9' }],\n },\n (args, context) => {\n const list = expectList('último', args[0]!, context);\n if (list.items.length === 0)\n throw context.fail('LISTA_VACÍA', '`último` no puede tomar nada de una lista vacía.');\n return list.items[list.items.length - 1]!;\n },\n ),\n\n // diccionarios\n define(\n 'claves',\n 1,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [{ name: 'd', type: 'diccionario' }],\n returns: 'lista',\n description: 'Una lista nueva con las claves del diccionario, en el orden en que se agregaron.',\n examples: [{ code: 'claves({ \"a\": 1, \"b\": 2 })', result: '[\"a\", \"b\"]' }],\n },\n (args, context) => context.newList([...expectDict('claves', args[0]!, context).entries.keys()]),\n ),\n define(\n 'valores',\n 1,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [{ name: 'd', type: 'diccionario' }],\n returns: 'lista',\n description: 'Una lista nueva con los valores del diccionario, en el orden de sus claves.',\n examples: [{ code: 'valores({ \"a\": 1, \"b\": 2 })', result: '[1, 2]' }],\n },\n (args, context) => context.newList([...expectDict('valores', args[0]!, context).entries.values()]),\n ),\n define(\n 'tiene',\n 2,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [\n { name: 'd', type: 'diccionario' },\n { name: 'clave', type: 'texto | número' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el diccionario tiene esa clave.',\n examples: [\n { code: 'tiene({ \"a\": 1 }, \"a\")', result: 'verdadero' },\n { code: 'tiene({ \"a\": 1 }, \"b\")', result: 'falso' },\n ],\n },\n (args, context) => expectDict('tiene', args[0]!, context).entries.has(expectKey('tiene', args[1]!, context)),\n ),\n\n // matemáticas\n define(\n 'piso',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Redondea hacia abajo.',\n examples: [\n { code: 'piso(2.7)', result: '2' },\n { code: 'piso(-2.1)', result: '-3' },\n ],\n },\n (args, context) => Math.floor(expectNumber('piso', args[0]!, context)),\n ),\n define(\n 'techo',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Redondea hacia arriba.',\n examples: [{ code: 'techo(2.1)', result: '3' }],\n },\n (args, context) => Math.ceil(expectNumber('techo', args[0]!, context)),\n ),\n define(\n 'entero',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Quita los decimales, sin redondear.',\n examples: [{ code: 'entero(-2.7)', result: '-2' }],\n },\n (args, context) => Math.trunc(expectNumber('entero', args[0]!, context)),\n ),\n define(\n 'raíz',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'La raíz cuadrada. De un número negativo es un error.',\n examples: [{ code: 'raíz(16)', result: '4' }],\n },\n (args, context) => {\n const value = expectNumber('raíz', args[0]!, context);\n if (value < 0) {\n throw context.fail(\n 'RAÍZ_DE_NEGATIVO',\n `\\`raíz\\` no tiene un resultado real para ${repr(value)}.`,\n 'La raíz cuadrada solo existe para números de 0 en adelante. ¿Quisiste usar `absoluto(…)` antes?',\n );\n }\n return Math.sqrt(value);\n },\n ),\n define(\n 'aleatorio',\n 2,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [\n { name: 'mínimo', type: 'número' },\n { name: 'máximo', type: 'número' },\n ],\n returns: 'número',\n description:\n 'Un entero al azar entre `mínimo` y `máximo`, los dos incluidos. Con la misma semilla da los mismos números.',\n examples: [{ code: 'variable dado = aleatorio(1, 6)\\ndado >= 1 y dado <= 6', result: 'verdadero' }],\n },\n (args, context) => {\n const low = expectInteger('aleatorio', args[0]!, context, ' como mínimo');\n const high = expectInteger('aleatorio', args[1]!, context, ' como máximo');\n if (low > high) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`aleatorio\\` necesita que el mínimo (${low}) no sea mayor que el máximo (${high}).`,\n );\n }\n return low + Math.floor(context.random() * (high - low + 1));\n },\n ),\n\n // texto\n define(\n 'mayúsculas',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El mismo texto en mayúsculas.',\n examples: [{ code: 'mayúsculas(\"Ñandú\")', result: '\"ÑANDÚ\"' }],\n },\n (args, context) => expectText('mayúsculas', args[0]!, context).toLocaleUpperCase('es'),\n ),\n define(\n 'minúsculas',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El mismo texto en minúsculas.',\n examples: [{ code: 'minúsculas(\"ÁRBOL\")', result: '\"árbol\"' }],\n },\n (args, context) => expectText('minúsculas', args[0]!, context).toLocaleLowerCase('es'),\n ),\n define(\n 'recortar',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El texto sin espacios ni saltos de línea al principio y al final.',\n examples: [{ code: 'recortar(\" hola \")', result: '\"hola\"' }],\n },\n (args, context) => expectText('recortar', args[0]!, context).trim(),\n ),\n define(\n 'dividir',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'separador', type: 'texto' },\n ],\n returns: 'lista',\n description: 'Parte el texto en cada aparición del separador.',\n examples: [{ code: 'dividir(\"a,b,c\", \",\")', result: '[\"a\", \"b\", \"c\"]' }],\n },\n (args, context) => {\n const text = expectText('dividir', args[0]!, context);\n const separator = expectText('dividir', args[1]!, context, ' como separador');\n if (separator === '') {\n throw context.fail(\n 'SEPARADOR_VACÍO',\n '`dividir` necesita un separador que no esté vacío.',\n 'Para separar un texto letra por letra usa `caracteres(t)`.',\n );\n }\n return context.newList(text.split(separator));\n },\n ),\n define(\n 'unir',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'separador', type: 'texto' },\n ],\n returns: 'texto',\n description: 'Une los elementos de la lista en un texto, con el separador entre cada uno.',\n examples: [{ code: 'unir([\"a\", \"b\", \"c\"], \"-\")', result: '\"a-b-c\"' }],\n },\n (args, context) => {\n const list = expectList('unir', args[0]!, context);\n const separator = expectText('unir', args[1]!, context, ' como separador');\n return list.items.map(show).join(separator);\n },\n ),\n define(\n 'reemplazar',\n 3,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'buscar', type: 'texto' },\n { name: 'poner', type: 'texto' },\n ],\n returns: 'texto',\n description: 'Cambia cada aparición de `buscar` por `poner`.',\n examples: [{ code: 'reemplazar(\"la casa\", \"a\", \"o\")', result: '\"lo coso\"' }],\n },\n (args, context) => {\n const text = expectText('reemplazar', args[0]!, context);\n const search = expectText('reemplazar', args[1]!, context, ' para buscar');\n const replacement = expectText('reemplazar', args[2]!, context, ' para poner');\n if (search === '') {\n throw context.fail('SEPARADOR_VACÍO', '`reemplazar` necesita un texto que buscar que no esté vacío.');\n }\n return text.replaceAll(search, replacement);\n },\n ),\n define(\n 'contiene',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto | lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'lógico',\n description: 'En un texto, si aparece la parte buscada; en una lista, si está el valor (comparando por valor).',\n examples: [\n { code: 'contiene(\"murciélago\", \"cié\")', result: 'verdadero' },\n { code: 'contiene([1, 2], 3)', result: 'falso' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isList(container)) return container.items.some(item => equals(item, args[1]!));\n return expectTextOrList('contiene', container, context).includes(\n expectText('contiene', args[1]!, context, ' para buscar'),\n );\n },\n ),\n define(\n 'posición_de',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto | lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'número',\n description: 'Dónde aparece por primera vez la parte o el valor buscado, o `-1` si no está.',\n examples: [\n { code: 'posición_de(\"banana\", \"na\")', result: '2' },\n { code: 'posición_de([5, 6], 7)', result: '-1' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isList(container)) return container.items.findIndex(item => equals(item, args[1]!));\n return expectTextOrList('posición_de', container, context).indexOf(\n expectText('posición_de', args[1]!, context, ' para buscar'),\n );\n },\n ),\n define(\n 'empieza_con',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'inicio', type: 'texto' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el texto empieza con `inicio`.',\n examples: [{ code: 'empieza_con(\"Codexivo\", \"Code\")', result: 'verdadero' }],\n },\n (args, context) =>\n expectText('empieza_con', args[0]!, context).startsWith(\n expectText('empieza_con', args[1]!, context, ' como inicio'),\n ),\n ),\n define(\n 'termina_con',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'final', type: 'texto' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el texto termina con `final`.',\n examples: [{ code: 'termina_con(\"Codexivo\", \"vo\")', result: 'verdadero' }],\n },\n (args, context) =>\n expectText('termina_con', args[0]!, context).endsWith(\n expectText('termina_con', args[1]!, context, ' como final'),\n ),\n ),\n define(\n 'subtexto',\n 3,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n ],\n returns: 'texto',\n description: 'Los caracteres desde `inicio` hasta antes de `fin`.',\n examples: [{ code: 'subtexto(\"hola\", 1, 3)', result: '\"ol\"' }],\n },\n (args, context) => {\n const text = expectText('subtexto', args[0]!, context);\n const [start, end] = sliceBounds('subtexto', args, text.length, false, context);\n return text.slice(start, end);\n },\n ),\n define(\n 'caracteres',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'lista',\n description: 'Una lista con cada carácter del texto.',\n examples: [{ code: 'caracteres(\"año\")', result: '[\"a\", \"ñ\", \"o\"]' }],\n },\n (args, context) => context.newList([...expectText('caracteres', args[0]!, context)]),\n ),\n define(\n 'código_de',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 'c', type: 'texto' }],\n returns: 'número',\n description: 'El código Unicode de un carácter.',\n examples: [{ code: 'código_de(\"A\")', result: '65' }],\n },\n (args, context) => {\n const text = expectText('código_de', args[0]!, context);\n const characters = [...text];\n if (characters.length !== 1) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`código_de\\` espera un solo carácter, pero recibió ${repr(text)}.`,\n 'Para un texto más largo, recorre `caracteres(t)`.',\n );\n }\n return characters[0]!.codePointAt(0)!;\n },\n ),\n define(\n 'carácter_de',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 'n', type: 'número' }],\n returns: 'texto',\n description: 'El carácter que tiene ese código Unicode.',\n examples: [{ code: 'carácter_de(241)', result: '\"ñ\"' }],\n },\n (args, context) => {\n const code = expectInteger('carácter_de', args[0]!, context);\n if (code < 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) {\n throw context.fail('TIPO_DE_ARGUMENTO', `${code} no es el código de ningún carácter.`);\n }\n return String.fromCodePoint(code);\n },\n ),\n\n // listas que cambian\n define(\n 'insertar',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'posición', type: 'número' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` en esa posición y recorre los demás elementos.',\n examples: [{ code: 'variable l = [1, 3]\\ninsertar(l, 1, 2)\\nl', result: '[1, 2, 3]' }],\n },\n (args, context) => {\n const list = expectList('insertar', args[0]!, context);\n const position = positionIn('insertar', args[1]!, list.items.length, true, context, true);\n list.items.splice(position, 0, args[2]!);\n return null;\n },\n ),\n define(\n 'quitar_último',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el último elemento y lo regresa.',\n examples: [{ code: 'variable l = [1, 2]\\n[quitar_último(l), l]', result: '[2, [1]]' }],\n },\n (args, context) => {\n const list = expectList('quitar_último', args[0]!, context);\n if (list.items.length === 0) throw emptyListError('quitar_último', context);\n return list.items.pop()!;\n },\n ),\n define(\n 'quitar_primero',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el primer elemento y lo regresa.',\n examples: [{ code: 'variable l = [1, 2]\\n[quitar_primero(l), l]', result: '[1, [2]]' }],\n },\n (args, context) => {\n const list = expectList('quitar_primero', args[0]!, context);\n if (list.items.length === 0) throw emptyListError('quitar_primero', context);\n return list.items.shift()!;\n },\n ),\n define(\n 'vaciar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | diccionario' }],\n returns: 'nulo',\n mutates: true,\n description: 'Quita todos los elementos de una lista (o todas las claves de un diccionario).',\n examples: [{ code: 'variable l = [1, 2]\\nvaciar(l)\\nl', result: '[]' }],\n },\n (args, context) => {\n const container = args[0]!;\n if (isDict(container)) container.entries.clear();\n else expectList('vaciar', container, context).items.length = 0;\n return null;\n },\n ),\n\n // listas nuevas\n define(\n 'rebanar',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n ],\n returns: 'lista',\n description: 'Una lista nueva con los elementos desde `inicio` hasta antes de `fin`.',\n examples: [{ code: 'rebanar([1, 2, 3, 4], 1, 3)', result: '[2, 3]' }],\n },\n (args, context) => {\n const list = expectList('rebanar', args[0]!, context);\n const [start, end] = sliceBounds('rebanar', args, list.items.length, true, context);\n return context.newList(list.items.slice(start, end));\n },\n ),\n define(\n 'invertir',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | texto' }],\n returns: 'lista | texto',\n description: 'Una lista (o un texto) nueva al revés.',\n examples: [\n { code: 'invertir([1, 2, 3])', result: '[3, 2, 1]' },\n { code: 'invertir(\"hola\")', result: '\"aloh\"' },\n ],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'string') return [...value].reverse().join('');\n if (isList(value)) return context.newList([...value.items].reverse());\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`invertir\\` espera una lista o un texto, pero recibió ${describeType(typeOf(value))}.`,\n );\n },\n ),\n define(\n 'copiar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | diccionario' }],\n returns: 'lista | diccionario',\n description:\n 'Una lista o diccionario nuevo con los mismos elementos. Los elementos que son listas se siguen compartiendo.',\n examples: [{ code: 'variable a = [1]\\nvariable b = copiar(a)\\nagregar(b, 2)\\n[a, b]', result: '[[1], [1, 2]]' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (isDict(value)) return context.newDict(new Map(value.entries));\n return context.newList([...expectList('copiar', value, context).items]);\n },\n ),\n define(\n 'sumar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'número',\n description: 'La suma de los números de la lista.',\n examples: [{ code: 'sumar([1, 2, 3.5])', result: '6.5' }],\n },\n (args, context) =>\n expectList('sumar', args[0]!, context).items.reduce<number>(\n (total, item) => total + expectNumber('sumar', item, context, ' en cada elemento'),\n 0,\n ),\n ),\n define(\n 'lista_de',\n 2,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'n', type: 'número' },\n { name: 'valor', type: 'cualquiera' },\n ],\n returns: 'lista',\n description: 'Una lista con `n` copias de `valor`. Si el valor es una lista, cada casilla tiene su propia copia.',\n examples: [{ code: 'lista_de(3, 0)', result: '[0, 0, 0]' }],\n },\n (args, context) => {\n const count = expectCount('lista_de', args[0]!, context, ' como cantidad');\n return context.newList(Array.from({ length: count }, () => deepCopy(args[1]!, context)));\n },\n ),\n define(\n 'matriz',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'filas', type: 'número' },\n { name: 'columnas', type: 'número' },\n { name: 'valor', type: 'cualquiera' },\n ],\n returns: 'lista',\n description: 'Una lista de filas, cada una con `columnas` copias de `valor`.',\n examples: [{ code: 'matriz(2, 3, 0)', result: '[[0, 0, 0], [0, 0, 0]]' }],\n },\n (args, context) => {\n const rows = expectCount('matriz', args[0]!, context, ' como filas');\n const columns = expectCount('matriz', args[1]!, context, ' como columnas');\n if (rows * columns > MAX_RANGE) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`matriz\\` produciría ${rows * columns} casillas; el máximo es ${MAX_RANGE}.`,\n );\n }\n return context.newList(\n Array.from({ length: rows }, () =>\n context.newList(Array.from({ length: columns }, () => deepCopy(args[2]!, context))),\n ),\n );\n },\n ),\n\n // pilas y colas: listas con su propio vocabulario\n define(\n 'apilar',\n 2,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [\n { name: 'pila', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` encima de la pila.',\n examples: [{ code: 'variable p = []\\napilar(p, 1)\\napilar(p, 2)\\np', result: '[1, 2]' }],\n },\n (args, context) => {\n expectStructure('apilar', 'pila', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'desapilar',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'pila', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el elemento de encima de la pila y lo regresa.',\n examples: [{ code: 'variable p = [1, 2]\\n[desapilar(p), p]', result: '[2, [1]]' }],\n },\n (args, context) => {\n const stack = expectStructure('desapilar', 'pila', args[0]!, context);\n if (stack.items.length === 0) throw emptyStructure('desapilar', 'pila', context);\n return stack.items.pop()!;\n },\n ),\n define(\n 'tope',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'pila', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El elemento de encima de la pila, sin quitarlo.',\n examples: [{ code: 'tope([1, 2])', result: '2' }],\n },\n (args, context) => {\n const stack = expectStructure('tope', 'pila', args[0]!, context);\n if (stack.items.length === 0) throw emptyStructure('tope', 'pila', context);\n return stack.items[stack.items.length - 1]!;\n },\n ),\n define(\n 'encolar',\n 2,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [\n { name: 'cola', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` al final de la cola.',\n examples: [{ code: 'variable c = []\\nencolar(c, 1)\\nencolar(c, 2)\\nc', result: '[1, 2]' }],\n },\n (args, context) => {\n expectStructure('encolar', 'cola', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'desencolar',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'cola', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el primer elemento de la cola y lo regresa.',\n examples: [{ code: 'variable c = [1, 2]\\n[desencolar(c), c]', result: '[1, [2]]' }],\n },\n (args, context) => {\n const queue = expectStructure('desencolar', 'cola', args[0]!, context);\n if (queue.items.length === 0) throw emptyStructure('desencolar', 'cola', context);\n return queue.items.shift()!;\n },\n ),\n define(\n 'frente',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'cola', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El primer elemento de la cola, sin quitarlo.',\n examples: [{ code: 'frente([1, 2])', result: '1' }],\n },\n (args, context) => {\n const queue = expectStructure('frente', 'cola', args[0]!, context);\n if (queue.items.length === 0) throw emptyStructure('frente', 'cola', context);\n return queue.items[0]!;\n },\n ),\n];\n\n/** Constantes de la biblioteca. Una variable del usuario con el mismo nombre las oculta. */\nexport const constants: Readonly<Record<string, Value>> = {\n PI: Math.PI,\n};\n\n/** Documentación de cada constante, para el catálogo. */\nexport const constantDocs: Readonly<Record<string, { level: 'principiante'; description: string }>> = {\n PI: { level: 'principiante', description: 'La razón entre el perímetro de un círculo y su diámetro: 3.14159…' },\n};\n\n/** Quita los acentos agudos y la diéresis, pero conserva la ñ. */\nexport const withoutAccents = (name: string): string =>\n name.replace(/[áéíóúü]/g, character => ({ á: 'a', é: 'e', í: 'i', ó: 'o', ú: 'u', ü: 'u' })[character] ?? character);\n\n/** Biblioteca estándar. Cada nombre con acento también se acepta sin él (`máximo` y `maximo`). */\nexport const natives: Record<string, NativeValue> = (() => {\n const table: Record<string, NativeValue> = {};\n for (const native of library) table[native.name] = native;\n for (const native of library) {\n const alias = withoutAccents(native.name);\n if (!table[alias]) table[alias] = native;\n }\n return table;\n})();\n\n/**\n * Nativos que solo puede usar la biblioteca escrita en Codexivo (`prelude.ts`): validan argumentos con los\n * mismos mensajes que el resto de la biblioteca y ordenan sin comparador.\n */\nexport const internals: Record<string, NativeValue> = Object.fromEntries(\n [\n internal('revisar_lista', 2, (args, context) => {\n expectList(args[0] as string, args[1]!, context);\n return null;\n }),\n internal('revisar_procedimiento', 2, (args, context) => {\n const value = args[1]!;\n if (isCallable(value)) return null;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${args[0] as string}\\` espera un procedimiento, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n 'Pasa el nombre del procedimiento sin paréntesis (`mapear(lista, doble)`), o escribe uno: `procedimiento(x) { regresa x * 2 }`.',\n );\n }),\n internal('revisar_logico', 2, (args, context) => {\n const value = args[1]!;\n if (typeof value === 'boolean') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `El procedimiento que recibió \\`${args[0] as string}\\` tiene que regresar \\`verdadero\\` o \\`falso\\`, pero regresó ${repr(value)}.`,\n args[0] === 'ordenar'\n ? 'El comparador de `ordenar(lista, va_antes)` responde «¿va `a` antes que `b`?»: `procedimiento(a, b) { regresa a < b }`.'\n : '¿Le falta un `regresa` con una comparación, como `regresa x > 0`?',\n );\n }),\n internal('ordenar_natural', 1, (args, context) => {\n const list = expectList('ordenar', args[0]!, context);\n const kind = sortableKind(list, context);\n // `sort` de JavaScript es estable; los textos se comparan carácter por carácter, igual que `<`.\n const items = [...list.items].sort((a, b) =>\n kind === 'número' ? (a as number) - (b as number) : a! < b! ? -1 : a! > b! ? 1 : 0,\n );\n return context.newList(items);\n }),\n ].map(native => [native.name, native]),\n);\n",
|
|
12
|
+
"import { describeType, isCallable, isDict, isList, repr, show, typeOf, WAIT_FOR_INPUT } from './values';\nimport { COSTS } from './costs';\nimport { equals } from './values';\nimport type { DictValue, ListValue, NativeContext, NativeValue, ProcedureDoc, Value } from './values';\n\ntype NativeFn = (args: Value[], context: NativeContext) => Value | typeof WAIT_FOR_INPUT;\n\n/**\n * Define un procedimiento de la biblioteca. La documentación es obligatoria: de ahí sale el catálogo que usan el\n * sitio, el editor y las pruebas. El costo vive en `costs.ts`, en una sola tabla.\n */\nconst define = (name: string, arity: NativeValue['arity'], doc: ProcedureDoc, call: NativeFn): NativeValue => {\n const cost = COSTS[name];\n return { kind: 'nativo', name, arity, call, doc, ...(cost ? { cost } : {}) };\n};\n\n/** Un nativo que solo ve la biblioteca escrita en Codexivo: no se documenta porque el programa no lo ve. */\nconst internal = (name: string, arity: NativeValue['arity'], call: NativeFn): NativeValue => ({\n kind: 'nativo',\n name,\n arity,\n call,\n});\n\nconst expectNumber = (name: string, value: Value, context: NativeContext, position = ''): number => {\n if (typeof value === 'number') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un número${position}, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n );\n};\n\nconst expectList = (name: string, value: Value, context: NativeContext) => {\n if (isList(value)) return value;\n throw context.fail('TIPO_DE_ARGUMENTO', `\\`${name}\\` espera una lista, pero recibió ${describeType(typeOf(value))}.`);\n};\n\nconst expectText = (name: string, value: Value, context: NativeContext, position = ''): string => {\n if (typeof value === 'string') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un texto${position}, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n );\n};\n\nconst expectInteger = (name: string, value: Value, context: NativeContext, position = ''): number => {\n const number = expectNumber(name, value, context, position);\n if (Number.isInteger(number)) return number;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un número entero${position}, pero recibió ${repr(number)}.`,\n 'Redondea el valor con `redondear(…)`, `piso(…)` o `techo(…)`.',\n );\n};\n\nconst expectCount = (name: string, value: Value, context: NativeContext, position = ''): number => {\n const count = expectInteger(name, value, context, position);\n if (count >= 0 && count <= MAX_RANGE) return count;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n count < 0\n ? `\\`${name}\\` necesita una cantidad de 0 o más${position}, pero recibió ${count}.`\n : `\\`${name}\\` produciría ${count} elementos; el máximo es ${MAX_RANGE}.`,\n );\n};\n\n/** Mismo mensaje que el operador `[ ]` cuando el índice no cabe. */\nconst outOfRange = (index: number, length: number, list: boolean, context: NativeContext) => {\n const what = list ? 'la lista' : 'el texto';\n const unit = list ? (length === 1 ? 'elemento' : 'elementos') : length === 1 ? 'carácter' : 'caracteres';\n return context.fail(\n 'ÍNDICE_FUERA_DE_RANGO',\n `El índice ${index} está fuera de ${what}, que tiene ${length} ${unit}.`,\n length === 0\n ? list\n ? 'La lista está vacía.'\n : 'El texto está vacío.'\n : `Los índices válidos van de 0 a ${length - 1} (o de -1 a -${length} desde el final).`,\n );\n};\n\n/**\n * Posición real de `value` en algo de longitud `length`. Los negativos cuentan desde el final. Con\n * `allowEnd`, `length` también vale (para `insertar` al final o como fin de `rebanar`).\n */\nconst positionIn = (\n name: string,\n value: Value,\n length: number,\n list: boolean,\n context: NativeContext,\n allowEnd = false,\n): number => {\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw context.fail('ÍNDICE_INVÁLIDO', `\\`${name}\\` necesita un índice entero, pero recibió ${repr(value)}.`);\n }\n const position = value < 0 ? length + value : value;\n if (position < 0 || position > length || (position === length && !allowEnd)) {\n throw outOfRange(value, length, list, context);\n }\n return position;\n};\n\n/** Copia una lista o un diccionario y todo lo que contiene, para no compartir casillas por accidente. */\nconst deepCopy = (value: Value, context: NativeContext, copies = new Map<Value, Value>()): Value => {\n if (!isList(value) && !isDict(value)) return value;\n const done = copies.get(value);\n if (done) return done;\n if (isList(value)) {\n const copy = context.newList([]);\n copies.set(value, copy);\n for (const item of value.items) copy.items.push(deepCopy(item, context, copies));\n return copy;\n }\n const copy = context.newDict(new Map());\n copies.set(value, copy);\n for (const [key, item] of value.entries) copy.entries.set(key, deepCopy(item, context, copies));\n return copy;\n};\n\nconst emptyListError = (name: string, context: NativeContext) =>\n context.fail('LISTA_VACÍA', `\\`${name}\\` no puede tomar nada de una lista vacía.`);\n\n/** Para `contiene` y `posición_de`, que con una lista ya se resolvieron: el valor tiene que ser un texto. */\nconst expectTextOrList = (name: string, value: Value, context: NativeContext): string => {\n if (typeof value === 'string') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un texto o una lista, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\n/** Inicio y fin (sin incluirlo) de `subtexto` y `rebanar`, con la misma convención que `[ ]`. */\nconst sliceBounds = (\n name: string,\n args: Value[],\n length: number,\n list: boolean,\n context: NativeContext,\n): [number, number] => {\n const start = positionIn(name, args[1]!, length, list, context, true);\n const end = positionIn(name, args[2]!, length, list, context, true);\n if (start > end) {\n throw context.fail(\n 'RANGO_INVÁLIDO',\n `\\`${name}\\` necesita que el inicio (${repr(args[1]!)}) no esté después del fin (${repr(args[2]!)}).`,\n 'El fin no se incluye: `subtexto(\"hola\", 1, 3)` es `\"ol\"`.',\n );\n }\n return [start, end];\n};\n\n/** Compara para `ordenar`: todos números o todos textos. */\nconst sortableKind = (list: ListValue, context: NativeContext): 'número' | 'texto' => {\n const first = list.items[0];\n const kind = typeof first === 'string' ? 'texto' : 'número';\n for (const item of list.items) {\n if (typeOf(item) !== kind) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`ordenar\\` necesita que todos los elementos sean números o todos textos, pero encontró ${describeType(typeOf(item))} (${repr(item)}).`,\n );\n }\n }\n return kind;\n};\n\n/** Una pila o una cola es una lista; los mensajes usan su propio vocabulario. */\nconst expectStructure = (name: string, kind: 'pila' | 'cola', value: Value, context: NativeContext): ListValue => {\n if (isList(value)) return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera una ${kind} (una lista), pero recibió ${describeType(typeOf(value))}.`,\n `Una ${kind} empieza como una lista vacía: \\`variable ${kind} = [];\\`.`,\n );\n};\n\nconst emptyStructure = (name: string, kind: 'pila' | 'cola', context: NativeContext) =>\n context.fail(\n kind === 'pila' ? 'PILA_VACÍA' : 'COLA_VACÍA',\n name === 'tope' || name === 'frente'\n ? `Una ${kind} vacía no tiene \\`${name}\\`.`\n : `No se puede \\`${name}\\` de una ${kind} vacía.`,\n `Revisa antes con \\`longitud(${kind}) > 0\\`.`,\n );\n\nconst expectDict = (name: string, value: Value, context: NativeContext): DictValue => {\n if (isDict(value)) return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${name}\\` espera un diccionario, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\nconst expectKey = (name: string, value: Value, context: NativeContext): string | number => {\n if (typeof value === 'string' || typeof value === 'number') return value;\n throw context.fail(\n 'CLAVE_INVÁLIDA',\n `\\`${name}\\` espera una clave de texto o número, pero recibió ${describeType(typeOf(value))}.`,\n );\n};\n\nconst numbersOf = (name: string, args: Value[], context: NativeContext): number[] => {\n const values = args.length === 1 && isList(args[0]!) ? args[0].items : args;\n if (values.length === 0) {\n throw context.fail('LISTA_VACÍA', `\\`${name}\\` necesita al menos un número, pero la lista está vacía.`);\n }\n return values.map(value => expectNumber(name, value, context));\n};\n\nconst parseNumber = (text: string): number | undefined => {\n const trimmed = text.trim();\n if (!/^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)$/.test(trimmed)) return undefined;\n return Number(trimmed);\n};\n\n/** Redondeo escolar: los .5 se alejan del cero (2.5 → 3, -2.5 → -3). */\nconst roundHalfAway = (value: number, decimals: number): number => {\n const factor = 10 ** decimals;\n return (Math.sign(value) * Math.round(Math.abs(value) * factor)) / factor;\n};\n\n/** Más elementos que esto en una lista creada de golpe es casi siempre un error, y llenaría la memoria. */\nconst MAX_RANGE = 10_000_000;\n\nconst library: NativeValue[] = [\n // entrada y salida\n define(\n 'imprimir',\n [0, Infinity],\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [{ name: 'valor', type: 'cualquiera', optional: true }],\n variadic: true,\n returns: 'nulo',\n description:\n 'Escribe los valores separados por un espacio y termina la línea. Los textos se escriben sin comillas.',\n examples: [{ code: 'imprimir(\"Hola,\", \"Ana\", 16)', output: 'Hola, Ana 16\\n' }],\n },\n (args, context) => {\n context.write(`${args.map(show).join(' ')}\\n`);\n return null;\n },\n ),\n define(\n 'leer',\n 0,\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [],\n returns: 'texto | nulo',\n description: 'Lee la siguiente línea de entrada como texto. Si ya no hay más entrada, regresa `nulo`.',\n examples: [{ code: 'leer()', result: 'nulo' }],\n },\n (_args, context) => context.readLine(),\n ),\n define(\n 'leer_número',\n 0,\n {\n level: 'principiante',\n category: 'entrada y salida',\n params: [],\n returns: 'número',\n description: 'Lee la siguiente línea de entrada y la convierte en número. Si no es un número, es un error.',\n examples: [{ code: 'variable edad = 0\\nsi (falso) { edad = leer_número() }\\nedad', result: '0' }],\n },\n (_args, context) => {\n const line = context.readLine();\n if (line === WAIT_FOR_INPUT) return line;\n if (line === null) throw context.fail('SIN_ENTRADA', '`leer_número` no encontró más datos de entrada.');\n const value = parseNumber(line);\n if (value === undefined) {\n throw context.fail('NO_ES_NÚMERO', `\\`leer_número\\` esperaba un número, pero leyó ${JSON.stringify(line)}.`);\n }\n return value;\n },\n ),\n\n // tipos y conversiones\n define(\n 'tipo',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'cualquiera' }],\n returns: 'texto',\n description:\n 'El nombre del tipo de un valor: \"número\", \"texto\", \"lógico\", \"nulo\", \"lista\", \"diccionario\", \"dominio\" o \"procedimiento\".',\n examples: [\n { code: 'tipo(3.5)', result: '\"número\"' },\n { code: 'tipo([1, 2])', result: '\"lista\"' },\n ],\n },\n args => typeOf(args[0]!),\n ),\n define(\n 'texto',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'cualquiera' }],\n returns: 'texto',\n description: 'Convierte cualquier valor en texto, como lo escribiría `imprimir`.',\n examples: [{ code: 'texto(42) + \"!\"', result: '\"42!\"' }],\n },\n args => show(args[0]!),\n ),\n define(\n 'número',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'texto | número' }],\n returns: 'número',\n description: 'Convierte un texto en número. Si el texto no es un número, es un error.',\n examples: [{ code: 'número(\"3.5\") * 2', result: '7' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = parseNumber(value);\n if (parsed !== undefined) return parsed;\n throw context.fail('NO_ES_NÚMERO', `No se puede convertir ${JSON.stringify(value)} en número.`);\n }\n throw context.fail('TIPO_DE_ARGUMENTO', `No se puede convertir ${describeType(typeOf(value))} en número.`);\n },\n ),\n define(\n 'longitud',\n 1,\n {\n level: 'principiante',\n category: 'tipos',\n params: [{ name: 'x', type: 'texto | lista | diccionario' }],\n returns: 'número',\n description: 'Cuántos caracteres tiene un texto, cuántos elementos una lista o cuántas claves un diccionario.',\n examples: [\n { code: 'longitud(\"año\")', result: '3' },\n { code: 'longitud([1, 2, 3])', result: '3' },\n ],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'string') return [...value].length;\n if (isList(value)) return value.items.length;\n if (isDict(value)) return value.entries.size;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`longitud\\` espera un texto, una lista o un diccionario, pero recibió ${describeType(typeOf(value))}.`,\n );\n },\n ),\n\n // verificación\n define(\n 'afirmar',\n [1, 2],\n {\n level: 'principiante',\n category: 'verificación',\n params: [\n { name: 'condición', type: 'lógico' },\n { name: 'mensaje', type: 'texto', optional: true },\n ],\n returns: 'nulo',\n description:\n 'Detiene el programa con un error si la condición es falsa. Sirve para escribir lo que esperas que sea cierto y comprobarlo.',\n examples: [\n { code: 'variable total = 2 + 2\\nafirmar(total es_igual_a 4, \"la suma está mal\")\\ntotal', result: '4' },\n ],\n },\n (args, context) => {\n const condition = args[0]!;\n if (typeof condition !== 'boolean') {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`afirmar\\` espera una condición \\`verdadero\\` o \\`falso\\`, pero recibió ${describeType(typeOf(condition))} (${repr(condition)}).`,\n '¿Quisiste comparar? Por ejemplo: `afirmar(x es_mayor_que 0)`.',\n );\n }\n const message = args[1];\n if (message !== undefined && typeof message !== 'string') {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `El mensaje de \\`afirmar\\` tiene que ser un texto, pero es ${describeType(typeOf(message))}.`,\n 'Escribe el mensaje entre comillas: `afirmar(x es_mayor_que 0, \"x tenía que ser positivo\")`.',\n );\n }\n if (condition) return null;\n throw context.fail(\n 'AFIRMACIÓN_FALLIDA',\n message ? `La afirmación no se cumplió: ${message}` : 'La afirmación no se cumplió.',\n 'Lo que afirmaste que era cierto no lo es en este punto. Revisa los valores de las variables justo antes de esta línea.',\n );\n },\n ),\n\n // matemáticas\n define(\n 'absoluto',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'El valor absoluto: la distancia del número al 0.',\n examples: [{ code: 'absoluto(-3)', result: '3' }],\n },\n (args, context) => Math.abs(expectNumber('absoluto', args[0]!, context)),\n ),\n define(\n 'máximo',\n [1, Infinity],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'números', type: 'número | lista' }],\n variadic: true,\n returns: 'número',\n description: 'El mayor de varios números, o de los números de una lista.',\n examples: [\n { code: 'máximo(3, 9, 2)', result: '9' },\n { code: 'máximo([4, 1])', result: '4' },\n ],\n },\n (args, context) => Math.max(...numbersOf('máximo', args, context)),\n ),\n define(\n 'mínimo',\n [1, Infinity],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'números', type: 'número | lista' }],\n variadic: true,\n returns: 'número',\n description: 'El menor de varios números, o de los números de una lista.',\n examples: [{ code: 'mínimo(3, 9, 2)', result: '2' }],\n },\n (args, context) => Math.min(...numbersOf('mínimo', args, context)),\n ),\n define(\n 'redondear',\n [1, 2],\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [\n { name: 'x', type: 'número' },\n { name: 'decimales', type: 'número', optional: true },\n ],\n returns: 'número',\n description: 'Redondea al entero más cercano, o a cierta cantidad de decimales. Los .5 se alejan del cero.',\n examples: [\n { code: 'redondear(2.5)', result: '3' },\n { code: 'redondear(3.14159, 2)', result: '3.14' },\n ],\n },\n (args, context) => {\n const value = expectNumber('redondear', args[0]!, context);\n const decimals = args.length > 1 ? expectNumber('redondear', args[1]!, context, ' de decimales') : 0;\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n 'La cantidad de decimales de `redondear` tiene que ser un entero positivo o 0.',\n );\n }\n return roundHalfAway(value, decimals);\n },\n ),\n\n // listas\n define(\n 'agregar',\n 2,\n {\n level: 'principiante',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Agrega `x` al final de la lista.',\n examples: [{ code: 'variable l = [1]\\nagregar(l, 2)\\nl', result: '[1, 2]' }],\n },\n (args, context) => {\n expectList('agregar', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'rango',\n [2, 3],\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n { name: 'paso', type: 'número', optional: true },\n ],\n returns: 'lista',\n description: 'Lista de números de `inicio` a `fin`, incluyendo `fin`. Con un paso negativo cuenta hacia abajo.',\n examples: [\n { code: 'rango(1, 5)', result: '[1, 2, 3, 4, 5]' },\n { code: 'rango(10, 0, -5)', result: '[10, 5, 0]' },\n ],\n },\n (args, context) => {\n const start = expectNumber('rango', args[0]!, context, ' como inicio');\n const end = expectNumber('rango', args[1]!, context, ' como final');\n const step = args.length > 2 ? expectNumber('rango', args[2]!, context, ' como paso') : 1;\n if (step === 0) {\n throw context.fail(\n 'RANGO_PASO_CERO',\n 'El paso de `rango` no puede ser 0: nunca llegaría al final.',\n 'Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n );\n }\n // Se tolera un error de redondeo pequeño para que `rango(0, 1, 0.1)` incluya el 1.\n const count = Math.floor((end - start) / step + 1e-9) + 1;\n if (!Number.isFinite(count)) throw context.fail('TIPO_DE_ARGUMENTO', '`rango` necesita números finitos.');\n if (count > MAX_RANGE) {\n throw context.fail(\n 'RANGO_DEMASIADO_GRANDE',\n `\\`rango\\` produciría ${count} números; el máximo es ${MAX_RANGE}.`,\n 'Revisa el inicio, el final y el paso.',\n );\n }\n return context.newList(Array.from({ length: Math.max(0, count) }, (_, index) => start + index * step));\n },\n ),\n define(\n 'índices',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | texto' }],\n returns: 'lista',\n description: 'Las posiciones válidas de una lista o texto, de 0 a `longitud - 1`.',\n examples: [{ code: 'índices([\"a\", \"b\", \"c\"])', result: '[0, 1, 2]' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value !== 'string' && !isList(value)) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`índices\\` espera una lista o un texto, pero recibió ${describeType(typeOf(value))}.`,\n );\n }\n const length = typeof value === 'string' ? value.length : value.items.length;\n return context.newList(Array.from({ length }, (_, index) => index));\n },\n ),\n define(\n 'quitar',\n 2,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista | diccionario' },\n { name: 'posición', type: 'número | texto' },\n ],\n returns: 'cualquiera',\n mutates: true,\n description:\n 'Quita el elemento en esa posición de una lista, o esa clave de un diccionario, y regresa lo que quitó.',\n examples: [\n { code: 'variable l = [1, 2, 3]\\n[quitar(l, 0), l]', result: '[1, [2, 3]]' },\n { code: 'variable d = { \"a\": 1 }\\n[quitar(d, \"a\"), d]', result: '[1, {}]' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isDict(container)) {\n const key = expectKey('quitar', args[1]!, context);\n if (!container.entries.has(key)) {\n throw context.fail(\n 'CLAVE_INEXISTENTE',\n `\\`quitar\\` no encontró la clave ${repr(key)} en el diccionario.`,\n `Usa \\`tiene(d, ${repr(key)})\\` para preguntar antes de quitarla.`,\n );\n }\n const value = container.entries.get(key)!;\n container.entries.delete(key);\n return value;\n }\n if (!isList(container)) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`quitar\\` espera una lista o un diccionario, pero recibió ${describeType(typeOf(container))}.`,\n );\n }\n const index = args[1]!;\n if (typeof index !== 'number' || !Number.isInteger(index)) {\n throw context.fail('ÍNDICE_INVÁLIDO', `El índice tiene que ser un número entero, pero es ${repr(index)}.`);\n }\n const length = container.items.length;\n const position = index < 0 ? length + index : index;\n if (position < 0 || position >= length) {\n throw context.fail(\n 'ÍNDICE_FUERA_DE_RANGO',\n `El índice ${index} está fuera de la lista, que tiene ${length} ${length === 1 ? 'elemento' : 'elementos'}.`,\n length === 0\n ? 'La lista está vacía.'\n : `Los índices válidos van de 0 a ${length - 1} (o de -1 a -${length} desde el final).`,\n );\n }\n return container.items.splice(position, 1)[0]!;\n },\n ),\n define(\n 'primero',\n 1,\n {\n level: 'principiante',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El primer elemento de la lista.',\n examples: [{ code: 'primero([7, 8, 9])', result: '7' }],\n },\n (args, context) => {\n const list = expectList('primero', args[0]!, context);\n if (list.items.length === 0)\n throw context.fail('LISTA_VACÍA', '`primero` no puede tomar nada de una lista vacía.');\n return list.items[0]!;\n },\n ),\n define(\n 'último',\n 1,\n {\n level: 'principiante',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El último elemento de la lista.',\n examples: [{ code: 'último([7, 8, 9])', result: '9' }],\n },\n (args, context) => {\n const list = expectList('último', args[0]!, context);\n if (list.items.length === 0)\n throw context.fail('LISTA_VACÍA', '`último` no puede tomar nada de una lista vacía.');\n return list.items[list.items.length - 1]!;\n },\n ),\n\n // diccionarios\n define(\n 'claves',\n 1,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [{ name: 'd', type: 'diccionario' }],\n returns: 'lista',\n description: 'Una lista nueva con las claves del diccionario, en el orden en que se agregaron.',\n examples: [{ code: 'claves({ \"a\": 1, \"b\": 2 })', result: '[\"a\", \"b\"]' }],\n },\n (args, context) => context.newList([...expectDict('claves', args[0]!, context).entries.keys()]),\n ),\n define(\n 'valores',\n 1,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [{ name: 'd', type: 'diccionario' }],\n returns: 'lista',\n description: 'Una lista nueva con los valores del diccionario, en el orden de sus claves.',\n examples: [{ code: 'valores({ \"a\": 1, \"b\": 2 })', result: '[1, 2]' }],\n },\n (args, context) => context.newList([...expectDict('valores', args[0]!, context).entries.values()]),\n ),\n define(\n 'tiene',\n 2,\n {\n level: 'intermedio',\n category: 'diccionarios',\n params: [\n { name: 'd', type: 'diccionario' },\n { name: 'clave', type: 'texto | número' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el diccionario tiene esa clave.',\n examples: [\n { code: 'tiene({ \"a\": 1 }, \"a\")', result: 'verdadero' },\n { code: 'tiene({ \"a\": 1 }, \"b\")', result: 'falso' },\n ],\n },\n (args, context) => expectDict('tiene', args[0]!, context).entries.has(expectKey('tiene', args[1]!, context)),\n ),\n\n // matemáticas\n define(\n 'piso',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Redondea hacia abajo.',\n examples: [\n { code: 'piso(2.7)', result: '2' },\n { code: 'piso(-2.1)', result: '-3' },\n ],\n },\n (args, context) => Math.floor(expectNumber('piso', args[0]!, context)),\n ),\n define(\n 'techo',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Redondea hacia arriba.',\n examples: [{ code: 'techo(2.1)', result: '3' }],\n },\n (args, context) => Math.ceil(expectNumber('techo', args[0]!, context)),\n ),\n define(\n 'entero',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'Quita los decimales, sin redondear.',\n examples: [{ code: 'entero(-2.7)', result: '-2' }],\n },\n (args, context) => Math.trunc(expectNumber('entero', args[0]!, context)),\n ),\n define(\n 'raíz',\n 1,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [{ name: 'x', type: 'número' }],\n returns: 'número',\n description: 'La raíz cuadrada. De un número negativo es un error.',\n examples: [{ code: 'raíz(16)', result: '4' }],\n },\n (args, context) => {\n const value = expectNumber('raíz', args[0]!, context);\n if (value < 0) {\n throw context.fail(\n 'RAÍZ_DE_NEGATIVO',\n `\\`raíz\\` no tiene un resultado real para ${repr(value)}.`,\n 'La raíz cuadrada solo existe para números de 0 en adelante. ¿Quisiste usar `absoluto(…)` antes?',\n );\n }\n return Math.sqrt(value);\n },\n ),\n define(\n 'aleatorio',\n 2,\n {\n level: 'principiante',\n category: 'matemáticas',\n params: [\n { name: 'mínimo', type: 'número' },\n { name: 'máximo', type: 'número' },\n ],\n returns: 'número',\n description:\n 'Un entero al azar entre `mínimo` y `máximo`, los dos incluidos. Con la misma semilla da los mismos números.',\n examples: [{ code: 'variable dado = aleatorio(1, 6)\\ndado >= 1 y dado <= 6', result: 'verdadero' }],\n },\n (args, context) => {\n const low = expectInteger('aleatorio', args[0]!, context, ' como mínimo');\n const high = expectInteger('aleatorio', args[1]!, context, ' como máximo');\n if (low > high) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`aleatorio\\` necesita que el mínimo (${low}) no sea mayor que el máximo (${high}).`,\n );\n }\n return low + Math.floor(context.random() * (high - low + 1));\n },\n ),\n\n // texto\n define(\n 'mayúsculas',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El mismo texto en mayúsculas.',\n examples: [{ code: 'mayúsculas(\"Ñandú\")', result: '\"ÑANDÚ\"' }],\n },\n (args, context) => expectText('mayúsculas', args[0]!, context).toLocaleUpperCase('es'),\n ),\n define(\n 'minúsculas',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El mismo texto en minúsculas.',\n examples: [{ code: 'minúsculas(\"ÁRBOL\")', result: '\"árbol\"' }],\n },\n (args, context) => expectText('minúsculas', args[0]!, context).toLocaleLowerCase('es'),\n ),\n define(\n 'recortar',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'texto',\n description: 'El texto sin espacios ni saltos de línea al principio y al final.',\n examples: [{ code: 'recortar(\" hola \")', result: '\"hola\"' }],\n },\n (args, context) => expectText('recortar', args[0]!, context).trim(),\n ),\n define(\n 'dividir',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'separador', type: 'texto' },\n ],\n returns: 'lista',\n description: 'Parte el texto en cada aparición del separador.',\n examples: [{ code: 'dividir(\"a,b,c\", \",\")', result: '[\"a\", \"b\", \"c\"]' }],\n },\n (args, context) => {\n const text = expectText('dividir', args[0]!, context);\n const separator = expectText('dividir', args[1]!, context, ' como separador');\n if (separator === '') {\n throw context.fail(\n 'SEPARADOR_VACÍO',\n '`dividir` necesita un separador que no esté vacío.',\n 'Para separar un texto letra por letra usa `caracteres(t)`.',\n );\n }\n return context.newList(text.split(separator));\n },\n ),\n define(\n 'unir',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'separador', type: 'texto' },\n ],\n returns: 'texto',\n description: 'Une los elementos de la lista en un texto, con el separador entre cada uno.',\n examples: [{ code: 'unir([\"a\", \"b\", \"c\"], \"-\")', result: '\"a-b-c\"' }],\n },\n (args, context) => {\n const list = expectList('unir', args[0]!, context);\n const separator = expectText('unir', args[1]!, context, ' como separador');\n return list.items.map(show).join(separator);\n },\n ),\n define(\n 'reemplazar',\n 3,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'buscar', type: 'texto' },\n { name: 'poner', type: 'texto' },\n ],\n returns: 'texto',\n description: 'Cambia cada aparición de `buscar` por `poner`.',\n examples: [{ code: 'reemplazar(\"la casa\", \"a\", \"o\")', result: '\"lo coso\"' }],\n },\n (args, context) => {\n const text = expectText('reemplazar', args[0]!, context);\n const search = expectText('reemplazar', args[1]!, context, ' para buscar');\n const replacement = expectText('reemplazar', args[2]!, context, ' para poner');\n if (search === '') {\n throw context.fail('SEPARADOR_VACÍO', '`reemplazar` necesita un texto que buscar que no esté vacío.');\n }\n return text.replaceAll(search, replacement);\n },\n ),\n define(\n 'contiene',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto | lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'lógico',\n description: 'En un texto, si aparece la parte buscada; en una lista, si está el valor (comparando por valor).',\n examples: [\n { code: 'contiene(\"murciélago\", \"cié\")', result: 'verdadero' },\n { code: 'contiene([1, 2], 3)', result: 'falso' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isList(container)) return container.items.some(item => equals(item, args[1]!));\n return expectTextOrList('contiene', container, context).includes(\n expectText('contiene', args[1]!, context, ' para buscar'),\n );\n },\n ),\n define(\n 'posición_de',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto | lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'número',\n description: 'Dónde aparece por primera vez la parte o el valor buscado, o `-1` si no está.',\n examples: [\n { code: 'posición_de(\"banana\", \"na\")', result: '2' },\n { code: 'posición_de([5, 6], 7)', result: '-1' },\n ],\n },\n (args, context) => {\n const container = args[0]!;\n if (isList(container)) return container.items.findIndex(item => equals(item, args[1]!));\n return expectTextOrList('posición_de', container, context).indexOf(\n expectText('posición_de', args[1]!, context, ' para buscar'),\n );\n },\n ),\n define(\n 'empieza_con',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'inicio', type: 'texto' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el texto empieza con `inicio`.',\n examples: [{ code: 'empieza_con(\"Codexivo\", \"Code\")', result: 'verdadero' }],\n },\n (args, context) =>\n expectText('empieza_con', args[0]!, context).startsWith(\n expectText('empieza_con', args[1]!, context, ' como inicio'),\n ),\n ),\n define(\n 'termina_con',\n 2,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'final', type: 'texto' },\n ],\n returns: 'lógico',\n description: '`verdadero` si el texto termina con `final`.',\n examples: [{ code: 'termina_con(\"Codexivo\", \"vo\")', result: 'verdadero' }],\n },\n (args, context) =>\n expectText('termina_con', args[0]!, context).endsWith(\n expectText('termina_con', args[1]!, context, ' como final'),\n ),\n ),\n define(\n 'subtexto',\n 3,\n {\n level: 'intermedio',\n category: 'texto',\n params: [\n { name: 't', type: 'texto' },\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n ],\n returns: 'texto',\n description: 'Los caracteres desde `inicio` hasta antes de `fin`.',\n examples: [{ code: 'subtexto(\"hola\", 1, 3)', result: '\"ol\"' }],\n },\n (args, context) => {\n const text = expectText('subtexto', args[0]!, context);\n const [start, end] = sliceBounds('subtexto', args, text.length, false, context);\n return text.slice(start, end);\n },\n ),\n define(\n 'caracteres',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 't', type: 'texto' }],\n returns: 'lista',\n description: 'Una lista con cada carácter del texto.',\n examples: [{ code: 'caracteres(\"año\")', result: '[\"a\", \"ñ\", \"o\"]' }],\n },\n (args, context) => context.newList([...expectText('caracteres', args[0]!, context)]),\n ),\n define(\n 'código_de',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 'c', type: 'texto' }],\n returns: 'número',\n description: 'El código Unicode de un carácter.',\n examples: [{ code: 'código_de(\"A\")', result: '65' }],\n },\n (args, context) => {\n const text = expectText('código_de', args[0]!, context);\n const characters = [...text];\n if (characters.length !== 1) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`código_de\\` espera un solo carácter, pero recibió ${repr(text)}.`,\n 'Para un texto más largo, recorre `caracteres(t)`.',\n );\n }\n return characters[0]!.codePointAt(0)!;\n },\n ),\n define(\n 'carácter_de',\n 1,\n {\n level: 'intermedio',\n category: 'texto',\n params: [{ name: 'n', type: 'número' }],\n returns: 'texto',\n description: 'El carácter que tiene ese código Unicode.',\n examples: [{ code: 'carácter_de(241)', result: '\"ñ\"' }],\n },\n (args, context) => {\n const code = expectInteger('carácter_de', args[0]!, context);\n if (code < 0 || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) {\n throw context.fail('TIPO_DE_ARGUMENTO', `${code} no es el código de ningún carácter.`);\n }\n return String.fromCodePoint(code);\n },\n ),\n\n // listas que cambian\n define(\n 'insertar',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'posición', type: 'número' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` en esa posición y recorre los demás elementos.',\n examples: [{ code: 'variable l = [1, 3]\\ninsertar(l, 1, 2)\\nl', result: '[1, 2, 3]' }],\n },\n (args, context) => {\n const list = expectList('insertar', args[0]!, context);\n const position = positionIn('insertar', args[1]!, list.items.length, true, context, true);\n list.items.splice(position, 0, args[2]!);\n return null;\n },\n ),\n define(\n 'quitar_último',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el último elemento y lo regresa.',\n examples: [{ code: 'variable l = [1, 2]\\n[quitar_último(l), l]', result: '[2, [1]]' }],\n },\n (args, context) => {\n const list = expectList('quitar_último', args[0]!, context);\n if (list.items.length === 0) throw emptyListError('quitar_último', context);\n return list.items.pop()!;\n },\n ),\n define(\n 'quitar_primero',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el primer elemento y lo regresa.',\n examples: [{ code: 'variable l = [1, 2]\\n[quitar_primero(l), l]', result: '[1, [2]]' }],\n },\n (args, context) => {\n const list = expectList('quitar_primero', args[0]!, context);\n if (list.items.length === 0) throw emptyListError('quitar_primero', context);\n return list.items.shift()!;\n },\n ),\n define(\n 'vaciar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | diccionario' }],\n returns: 'nulo',\n mutates: true,\n description: 'Quita todos los elementos de una lista (o todas las claves de un diccionario).',\n examples: [{ code: 'variable l = [1, 2]\\nvaciar(l)\\nl', result: '[]' }],\n },\n (args, context) => {\n const container = args[0]!;\n if (isDict(container)) container.entries.clear();\n else expectList('vaciar', container, context).items.length = 0;\n return null;\n },\n ),\n\n // listas nuevas\n define(\n 'rebanar',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'inicio', type: 'número' },\n { name: 'fin', type: 'número' },\n ],\n returns: 'lista',\n description: 'Una lista nueva con los elementos desde `inicio` hasta antes de `fin`.',\n examples: [{ code: 'rebanar([1, 2, 3, 4], 1, 3)', result: '[2, 3]' }],\n },\n (args, context) => {\n const list = expectList('rebanar', args[0]!, context);\n const [start, end] = sliceBounds('rebanar', args, list.items.length, true, context);\n return context.newList(list.items.slice(start, end));\n },\n ),\n define(\n 'invertir',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | texto' }],\n returns: 'lista | texto',\n description: 'Una lista (o un texto) nueva al revés.',\n examples: [\n { code: 'invertir([1, 2, 3])', result: '[3, 2, 1]' },\n { code: 'invertir(\"hola\")', result: '\"aloh\"' },\n ],\n },\n (args, context) => {\n const value = args[0]!;\n if (typeof value === 'string') return [...value].reverse().join('');\n if (isList(value)) return context.newList([...value.items].reverse());\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`invertir\\` espera una lista o un texto, pero recibió ${describeType(typeOf(value))}.`,\n );\n },\n ),\n define(\n 'copiar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista | diccionario' }],\n returns: 'lista | diccionario',\n description:\n 'Una lista o diccionario nuevo con los mismos elementos. Los elementos que son listas se siguen compartiendo.',\n examples: [{ code: 'variable a = [1]\\nvariable b = copiar(a)\\nagregar(b, 2)\\n[a, b]', result: '[[1], [1, 2]]' }],\n },\n (args, context) => {\n const value = args[0]!;\n if (isDict(value)) return context.newDict(new Map(value.entries));\n return context.newList([...expectList('copiar', value, context).items]);\n },\n ),\n define(\n 'sumar',\n 1,\n {\n level: 'intermedio',\n category: 'listas',\n params: [{ name: 'lista', type: 'lista' }],\n returns: 'número',\n description: 'La suma de los números de la lista.',\n examples: [{ code: 'sumar([1, 2, 3.5])', result: '6.5' }],\n },\n (args, context) =>\n expectList('sumar', args[0]!, context).items.reduce<number>(\n (total, item) => total + expectNumber('sumar', item, context, ' en cada elemento'),\n 0,\n ),\n ),\n define(\n 'lista_de',\n 2,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'n', type: 'número' },\n { name: 'valor', type: 'cualquiera' },\n ],\n returns: 'lista',\n description: 'Una lista con `n` copias de `valor`. Si el valor es una lista, cada casilla tiene su propia copia.',\n examples: [{ code: 'lista_de(3, 0)', result: '[0, 0, 0]' }],\n },\n (args, context) => {\n const count = expectCount('lista_de', args[0]!, context, ' como cantidad');\n return context.newList(Array.from({ length: count }, () => deepCopy(args[1]!, context)));\n },\n ),\n define(\n 'matriz',\n 3,\n {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'filas', type: 'número' },\n { name: 'columnas', type: 'número' },\n { name: 'valor', type: 'cualquiera' },\n ],\n returns: 'lista',\n description: 'Una lista de filas, cada una con `columnas` copias de `valor`.',\n examples: [{ code: 'matriz(2, 3, 0)', result: '[[0, 0, 0], [0, 0, 0]]' }],\n },\n (args, context) => {\n const rows = expectCount('matriz', args[0]!, context, ' como filas');\n const columns = expectCount('matriz', args[1]!, context, ' como columnas');\n if (rows * columns > MAX_RANGE) {\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`matriz\\` produciría ${rows * columns} casillas; el máximo es ${MAX_RANGE}.`,\n );\n }\n return context.newList(\n Array.from({ length: rows }, () =>\n context.newList(Array.from({ length: columns }, () => deepCopy(args[2]!, context))),\n ),\n );\n },\n ),\n\n // pilas y colas: listas con su propio vocabulario\n define(\n 'apilar',\n 2,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [\n { name: 'pila', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` encima de la pila.',\n examples: [{ code: 'variable p = []\\napilar(p, 1)\\napilar(p, 2)\\np', result: '[1, 2]' }],\n },\n (args, context) => {\n expectStructure('apilar', 'pila', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'desapilar',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'pila', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el elemento de encima de la pila y lo regresa.',\n examples: [{ code: 'variable p = [1, 2]\\n[desapilar(p), p]', result: '[2, [1]]' }],\n },\n (args, context) => {\n const stack = expectStructure('desapilar', 'pila', args[0]!, context);\n if (stack.items.length === 0) throw emptyStructure('desapilar', 'pila', context);\n return stack.items.pop()!;\n },\n ),\n define(\n 'tope',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'pila', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El elemento de encima de la pila, sin quitarlo.',\n examples: [{ code: 'tope([1, 2])', result: '2' }],\n },\n (args, context) => {\n const stack = expectStructure('tope', 'pila', args[0]!, context);\n if (stack.items.length === 0) throw emptyStructure('tope', 'pila', context);\n return stack.items[stack.items.length - 1]!;\n },\n ),\n define(\n 'encolar',\n 2,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [\n { name: 'cola', type: 'lista' },\n { name: 'x', type: 'cualquiera' },\n ],\n returns: 'nulo',\n mutates: true,\n description: 'Pone `x` al final de la cola.',\n examples: [{ code: 'variable c = []\\nencolar(c, 1)\\nencolar(c, 2)\\nc', result: '[1, 2]' }],\n },\n (args, context) => {\n expectStructure('encolar', 'cola', args[0]!, context).items.push(args[1]!);\n return null;\n },\n ),\n define(\n 'desencolar',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'cola', type: 'lista' }],\n returns: 'cualquiera',\n mutates: true,\n description: 'Quita el primer elemento de la cola y lo regresa.',\n examples: [{ code: 'variable c = [1, 2]\\n[desencolar(c), c]', result: '[1, [2]]' }],\n },\n (args, context) => {\n const queue = expectStructure('desencolar', 'cola', args[0]!, context);\n if (queue.items.length === 0) throw emptyStructure('desencolar', 'cola', context);\n return queue.items.shift()!;\n },\n ),\n define(\n 'frente',\n 1,\n {\n level: 'avanzado',\n category: 'estructuras',\n params: [{ name: 'cola', type: 'lista' }],\n returns: 'cualquiera',\n description: 'El primer elemento de la cola, sin quitarlo.',\n examples: [{ code: 'frente([1, 2])', result: '1' }],\n },\n (args, context) => {\n const queue = expectStructure('frente', 'cola', args[0]!, context);\n if (queue.items.length === 0) throw emptyStructure('frente', 'cola', context);\n return queue.items[0]!;\n },\n ),\n];\n\n/** Constantes de la biblioteca. Una variable del usuario con el mismo nombre las oculta. */\nexport const constants: Readonly<Record<string, Value>> = {\n PI: Math.PI,\n};\n\n/** Documentación de cada constante, para el catálogo. */\nexport const constantDocs: Readonly<Record<string, { level: 'principiante'; description: string }>> = {\n PI: { level: 'principiante', description: 'La razón entre el perímetro de un círculo y su diámetro: 3.14159…' },\n};\n\n/** Quita los acentos agudos y la diéresis, pero conserva la ñ. */\nexport const withoutAccents = (name: string): string =>\n name.replace(/[áéíóúü]/g, character => ({ á: 'a', é: 'e', í: 'i', ó: 'o', ú: 'u', ü: 'u' })[character] ?? character);\n\n/** Biblioteca estándar. Cada nombre con acento también se acepta sin él (`máximo` y `maximo`). */\nexport const natives: Record<string, NativeValue> = (() => {\n const table: Record<string, NativeValue> = {};\n for (const native of library) table[native.name] = native;\n for (const native of library) {\n const alias = withoutAccents(native.name);\n if (!table[alias]) table[alias] = native;\n }\n return table;\n})();\n\n/**\n * Nativos que solo puede usar la biblioteca escrita en Codexivo (`prelude.ts`): validan argumentos con los\n * mismos mensajes que el resto de la biblioteca y ordenan sin comparador.\n */\nexport const internals: Record<string, NativeValue> = Object.fromEntries(\n [\n internal('revisar_lista', 2, (args, context) => {\n expectList(args[0] as string, args[1]!, context);\n return null;\n }),\n internal('revisar_procedimiento', 2, (args, context) => {\n const value = args[1]!;\n if (isCallable(value)) return null;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `\\`${args[0] as string}\\` espera un procedimiento, pero recibió ${describeType(typeOf(value))} (${repr(value)}).`,\n 'Pasa el nombre del procedimiento sin paréntesis (`mapear(lista, doble)`), o escribe uno: `procedimiento(x) { regresa x * 2 }`.',\n );\n }),\n internal('revisar_logico', 2, (args, context) => {\n const value = args[1]!;\n if (typeof value === 'boolean') return value;\n throw context.fail(\n 'TIPO_DE_ARGUMENTO',\n `El procedimiento que recibió \\`${args[0] as string}\\` tiene que regresar \\`verdadero\\` o \\`falso\\`, pero regresó ${repr(value)}.`,\n args[0] === 'ordenar'\n ? 'El comparador de `ordenar(lista, va_antes)` responde «¿va `a` antes que `b`?»: `procedimiento(a, b) { regresa a < b }`.'\n : '¿Le falta un `regresa` con una comparación, como `regresa x > 0`?',\n );\n }),\n internal('ordenar_natural', 1, (args, context) => {\n const list = expectList('ordenar', args[0]!, context);\n const kind = sortableKind(list, context);\n // `sort` de JavaScript es estable; los textos se comparan carácter por carácter, igual que `<`.\n const items = [...list.items].sort((a, b) =>\n kind === 'número' ? (a as number) - (b as number) : a! < b! ? -1 : a! > b! ? 1 : 0,\n );\n return context.newList(items);\n }),\n ].map(native => [native.name, native]),\n);\n",
|
|
13
13
|
"import { parse } from '../syntax/parser';\nimport { compileProcedure } from './compiler';\nimport { COSTS } from './costs';\nimport type { Chunk } from './compiler';\nimport { Scope } from './values';\nimport type { ProcedureDoc, ProcedureValue } from './values';\n\n/**\n * Los procedimientos de la biblioteca que reciben procedimientos están escritos en Codexivo. Así, cuando\n * llaman a `f`, la llamada pasa por la máquina como cualquier otra: se puede pausar dentro de `f`, cuenta\n * para el límite de llamadas, emite sus eventos y sus operaciones se cuentan igual que siempre.\n *\n * Su propio código se compila como oculto (`Chunk.hidden`): no pausa ni emite pasos, y en lugar de contar\n * cada instrucción se cobra lo que dice `costs.ts`. Los `revisar_*` y `ordenar_natural` son nativos internos\n * que solo se ven desde aquí (`internals` en `builtins.ts`).\n */\nconst SOURCE = `\nprocedimiento mapear(lista, f) {\n revisar_lista(\"mapear\", lista);\n revisar_procedimiento(\"mapear\", f);\n variable resultado = [];\n para_cada elemento en lista {\n agregar(resultado, f(elemento));\n }\n regresa resultado;\n}\n\nprocedimiento filtrar(lista, f) {\n revisar_lista(\"filtrar\", lista);\n revisar_procedimiento(\"filtrar\", f);\n variable resultado = [];\n para_cada elemento en lista {\n si (revisar_logico(\"filtrar\", f(elemento))) {\n agregar(resultado, elemento);\n }\n }\n regresa resultado;\n}\n\nprocedimiento reducir(lista, f, inicial) {\n revisar_lista(\"reducir\", lista);\n revisar_procedimiento(\"reducir\", f);\n variable acumulado = inicial;\n para_cada elemento en lista {\n acumulado = f(acumulado, elemento);\n }\n regresa acumulado;\n}\n\nprocedimiento alguno(lista, f) {\n revisar_lista(\"alguno\", lista);\n revisar_procedimiento(\"alguno\", f);\n para_cada elemento en lista {\n si (revisar_logico(\"alguno\", f(elemento))) {\n regresa verdadero;\n }\n }\n regresa falso;\n}\n\nprocedimiento todos(lista, f) {\n revisar_lista(\"todos\", lista);\n revisar_procedimiento(\"todos\", f);\n para_cada elemento en lista {\n si (no revisar_logico(\"todos\", f(elemento))) {\n regresa falso;\n }\n }\n regresa verdadero;\n}\n\nprocedimiento buscar(lista, f) {\n revisar_lista(\"buscar\", lista);\n revisar_procedimiento(\"buscar\", f);\n para_cada elemento en lista {\n si (revisar_logico(\"buscar\", f(elemento))) {\n regresa elemento;\n }\n }\n regresa nulo;\n}\n\nprocedimiento ordenar(lista, va_antes) {\n revisar_lista(\"ordenar\", lista);\n si (va_antes == nulo) {\n regresa ordenar_natural(lista);\n }\n revisar_procedimiento(\"ordenar\", va_antes);\n\n // Ordenamiento por mezcla: estable, porque solo adelanta un elemento de la derecha si va antes.\n procedimiento mezclar(parte) {\n si (longitud(parte) <= 1) {\n regresa copiar(parte);\n }\n variable medio = longitud(parte) div 2;\n variable izquierda = mezclar(rebanar(parte, 0, medio));\n variable derecha = mezclar(rebanar(parte, medio, longitud(parte)));\n variable resultado = [];\n variable i = 0;\n variable j = 0;\n mientras (i < longitud(izquierda) y j < longitud(derecha)) {\n si (revisar_logico(\"ordenar\", va_antes(derecha[j], izquierda[i]))) {\n agregar(resultado, derecha[j]);\n j++;\n } si_no {\n agregar(resultado, izquierda[i]);\n i++;\n }\n }\n mientras (i < longitud(izquierda)) {\n agregar(resultado, izquierda[i]);\n i++;\n }\n mientras (j < longitud(derecha)) {\n agregar(resultado, derecha[j]);\n j++;\n }\n regresa resultado;\n }\n regresa mezclar(lista);\n}\n`;\n\nconst each = (): ProcedureDoc['params'] => [\n { name: 'lista', type: 'lista' },\n { name: 'f', type: 'procedimiento' },\n];\n\n/** Documentación de cada procedimiento de `SOURCE`, para el catálogo. */\nexport const libraryDocs: Readonly<Record<string, ProcedureDoc>> = {\n mapear: {\n level: 'avanzado',\n category: 'procedimientos',\n params: each(),\n returns: 'lista',\n description: 'Una lista nueva con el resultado de `f(x)` para cada elemento.',\n examples: [{ code: 'mapear([1, 2, 3], procedimiento(x) { regresa x * 2 })', result: '[2, 4, 6]' }],\n },\n filtrar: {\n level: 'avanzado',\n category: 'procedimientos',\n params: each(),\n returns: 'lista',\n description: 'Una lista nueva con los elementos para los que `f(x)` es `verdadero`.',\n examples: [{ code: 'filtrar([1, 2, 3, 4], procedimiento(x) { regresa x mod 2 == 0 })', result: '[2, 4]' }],\n },\n reducir: {\n level: 'avanzado',\n category: 'procedimientos',\n params: [...each(), { name: 'inicial', type: 'cualquiera' }],\n returns: 'cualquiera',\n description: 'Junta la lista en un solo valor: empieza con `inicial` y en cada elemento hace `f(acumulado, x)`.',\n examples: [{ code: 'reducir([1, 2, 3], procedimiento(total, x) { regresa total + x }, 0)', result: '6' }],\n },\n alguno: {\n level: 'avanzado',\n category: 'procedimientos',\n params: each(),\n returns: 'lógico',\n description: '`verdadero` si `f(x)` es `verdadero` para al menos un elemento.',\n examples: [{ code: 'alguno([1, 5], procedimiento(x) { regresa x > 3 })', result: 'verdadero' }],\n },\n todos: {\n level: 'avanzado',\n category: 'procedimientos',\n params: each(),\n returns: 'lógico',\n description: '`verdadero` si `f(x)` es `verdadero` para todos los elementos.',\n examples: [{ code: 'todos([1, 5], procedimiento(x) { regresa x > 3 })', result: 'falso' }],\n },\n buscar: {\n level: 'avanzado',\n category: 'procedimientos',\n params: each(),\n returns: 'cualquiera',\n description: 'El primer elemento para el que `f(x)` es `verdadero`, o `nulo` si no hay.',\n examples: [{ code: 'buscar([1, 5, 7], procedimiento(x) { regresa x > 3 })', result: '5' }],\n },\n ordenar: {\n level: 'intermedio',\n category: 'listas',\n params: [\n { name: 'lista', type: 'lista' },\n { name: 'va_antes', type: 'procedimiento', optional: true },\n ],\n returns: 'lista',\n description:\n 'Una lista nueva ordenada. Sin comparador, todos tienen que ser números o todos textos; `va_antes(a, b)` responde «¿va `a` antes que `b`?». Es estable.',\n examples: [\n { code: 'ordenar([3, 1, 2])', result: '[1, 2, 3]' },\n { code: 'ordenar([3, 1, 2], procedimiento(a, b) { regresa a > b })', result: '[3, 2, 1]' },\n ],\n },\n};\n\n/** Parámetros que se pueden omitir (llegan como `nulo`). */\nconst OPTIONAL: Readonly<Record<string, number>> = { ordenar: 1 };\n\nconst compileLibrary = (): Map<string, Chunk> => {\n const { program, errors } = parse(SOURCE);\n if (errors.length > 0) throw new Error(`La biblioteca en Codexivo tiene errores: ${errors[0]!.message}`);\n const chunks = new Map<string, Chunk>();\n for (const statement of program.statements) {\n if (statement.kind !== 'FunctionDeclaration') continue;\n const chunk = compileProcedure(statement.function, true);\n const optional = OPTIONAL[statement.name.name];\n if (optional !== undefined) chunk.minParams = optional;\n chunks.set(statement.name.name, chunk);\n }\n return chunks;\n};\n\n/**\n * Los procedimientos de la biblioteca escritos en Codexivo, por nombre. Son inmutables, así que todas las\n * máquinas los comparten. Sus `id` son negativos para no mover los de los valores del programa.\n */\nexport const libraryProcedures: Readonly<Record<string, ProcedureValue>> = (() => {\n const scope = new Scope();\n const table: Record<string, ProcedureValue> = {};\n let id = -1;\n for (const [name, chunk] of compileLibrary()) {\n const procedure: ProcedureValue = { kind: 'procedimiento', id: id--, name, chunk, closure: scope };\n scope.variables.set(name, procedure);\n table[name] = procedure;\n }\n return table;\n})();\n\n/** Costo de llamar a un procedimiento de la biblioteca escrito en Codexivo. */\nexport const libraryCost = (name: string) => COSTS[name];\n",
|
|
14
14
|
"const distance = (a: string, b: string): number => {\n const previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let i = 1; i <= a.length; i++) {\n let diagonal = previous[0]!;\n previous[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const above = previous[j]!;\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n previous[j] = Math.min(previous[j]! + 1, previous[j - 1]! + 1, diagonal + cost);\n diagonal = above;\n }\n }\n return previous[b.length]!;\n};\n\nconst fold = (text: string): string => text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/** El nombre más parecido a `name` entre `candidates`, si hay uno razonablemente cerca. */\nexport const suggestName = (name: string, candidates: Iterable<string>): string | undefined => {\n const target = fold(name);\n const limit = target.length <= 3 ? 1 : 2;\n let best: string | undefined;\n let bestDistance = Infinity;\n for (const candidate of new Set(candidates)) {\n if (candidate === name) continue;\n const current = distance(target, fold(candidate));\n if (current <= limit && current < bestDistance) {\n best = candidate;\n bestDistance = current;\n }\n }\n return best;\n};\n",
|
|
15
15
|
"import { CodexivoError } from '../errors';\nimport type { ErrorInfo } from '../errors';\nimport type * as ast from '../syntax/ast';\nimport type { Span } from '../syntax/token';\nimport type { RobotEvent, World, WorldState } from '../world';\nimport { constants as libraryConstants, internals, natives as defaultNatives } from './builtins';\nimport { COSTS } from './costs';\nimport { libraryProcedures } from './prelude';\nimport type { Chunk, DecisionLabel, Instruction } from './compiler';\nimport {\n describeType,\n equals,\n isCallable,\n isDict,\n isDomain,\n isList,\n repr,\n Scope,\n typeOf,\n WAIT_FOR_INPUT,\n} from './values';\nimport type {\n DictKey,\n DictValue,\n DomainValue,\n ListValue,\n NativeContext,\n NativeValue,\n ProcedureValue,\n Value,\n} from './values';\nimport { suggestName } from './suggest';\n\nexport type MachineStatus = 'lista' | 'pausada' | 'esperando_entrada' | 'terminada' | 'error';\n\nexport interface MachineOptions {\n /** Máximo de operaciones antes de detener el programa. Por defecto 10 000 000. */\n maxOperations?: number;\n /** Máximo de llamadas anidadas. Por defecto 10 000. */\n maxCallDepth?: number;\n /** Máximo de caracteres de salida. Por defecto 1 000 000. */\n maxOutput?: number;\n /** Líneas de entrada para `leer()`. */\n input?: string | string[];\n /** Si es `true`, `leer()` sin entrada pausa la máquina en lugar de regresar `nulo`. */\n interactiveInput?: boolean;\n /** Procedimientos nativos adicionales. */\n natives?: Record<string, NativeValue>;\n /** Mundo del robot (de `createWorld`): agrega sus procedimientos y su estado a `snapshot()`. */\n world?: World;\n /** Líneas donde `run()` se detiene antes de ejecutar la sentencia. */\n breakpoints?: number[];\n /** Alcance global compartido entre ejecuciones (lo usa el REPL). */\n globals?: Scope;\n /** Permite volver a declarar una variable existente (útil en el REPL). */\n allowRedeclare?: boolean;\n /**\n * Semilla de `aleatorio`. Con la misma semilla (y la misma entrada) la ejecución se repite idéntica. Si no\n * se da, la máquina elige una y la expone en `machine.seed`.\n */\n seed?: number;\n /** Recibe cada evento de la ejecución. Activarlo hace la ejecución más lenta. */\n onEvent?: (event: MachineEvent) => void;\n}\n\n// ── eventos y fotografías ────────────────────────────────────────────────────\n\nexport type SerializedValue =\n | { type: 'número'; value: number; repr: string }\n | { type: 'texto'; value: string; repr: string }\n | { type: 'lógico'; value: boolean; repr: string }\n | { type: 'nulo'; value: null; repr: string }\n | { type: 'lista'; ref: number; length: number; repr: string }\n | { type: 'diccionario'; ref: number; size: number; repr: string }\n | { type: 'dominio'; ref: number; name: string; repr: string }\n | { type: 'procedimiento'; name?: string; repr: string };\n\n/** Contenido de una lista o de un diccionario en `Snapshot.heap`. */\nexport type HeapEntry =\n | SerializedValue[]\n | { entries: Array<{ key: SerializedValue; value: SerializedValue }> }\n /** Un dominio: sus miembros en orden de declaración, y cuáles se pueden cambiar desde fuera. */\n | { domain: string; members: Array<{ name: string; value: SerializedValue; writable: boolean }> };\n\nexport const serialize = (value: Value): SerializedValue => {\n const text = repr(value);\n if (value === null) return { type: 'nulo', value: null, repr: text };\n switch (typeof value) {\n case 'number':\n return { type: 'número', value, repr: text };\n case 'string':\n return { type: 'texto', value, repr: text };\n case 'boolean':\n return { type: 'lógico', value, repr: text };\n }\n if (value.kind === 'lista') return { type: 'lista', ref: value.id, length: value.items.length, repr: text };\n if (value.kind === 'diccionario') return { type: 'diccionario', ref: value.id, size: value.entries.size, repr: text };\n if (value.kind === 'dominio') return { type: 'dominio', ref: value.id, name: value.name, repr: text };\n return { type: 'procedimiento', name: value.name, repr: text };\n};\n\ninterface EventBase {\n /** Operaciones ejecutadas hasta este evento. */\n operations: number;\n /** Profundidad de llamadas: 1 en el programa principal. */\n depth: number;\n}\n\nexport type MachineEvent = EventBase &\n (\n | { type: 'paso'; nodeId: number; nodeKind: ast.Statement['kind']; span: Span }\n | { type: 'declara'; name: string; constant: boolean; value: SerializedValue; nodeId: number; span: Span }\n | { type: 'asigna'; name: string; before: SerializedValue; after: SerializedValue; nodeId: number; span: Span }\n /** Cambio de un elemento de una lista (`lista[i] = …`); `ref` identifica la lista. */\n | {\n type: 'modifica';\n ref: number;\n key: SerializedValue;\n before: SerializedValue;\n after: SerializedValue;\n nodeId: number;\n span: Span;\n }\n | { type: 'decide'; label: DecisionLabel; value: boolean; nodeId: number; ownerId: number; span: Span }\n | {\n type: 'opera';\n operator: string;\n operands: SerializedValue[];\n result: SerializedValue;\n nodeId: number;\n span: Span;\n }\n | { type: 'llama'; name: string; args: SerializedValue[]; nodeId: number; span: Span }\n | { type: 'regresa'; name: string; value: SerializedValue }\n | (RobotEvent & { nodeId: number; span: Span })\n | { type: 'imprime'; text: string }\n | { type: 'lee'; text: string | null }\n | { type: 'error'; error: ErrorInfo }\n | { type: 'fin'; result: SerializedValue }\n );\n\nexport interface FrameSnapshot {\n name: string;\n callSpan?: Span;\n /** `true` en un procedimiento de la biblioteca escrito en Codexivo; sus variables no se muestran. */\n library?: boolean;\n /** Alcances del procedimiento, del más externo al más interno. */\n scopes: Array<Record<string, SerializedValue>>;\n}\n\nexport interface Snapshot {\n status: MachineStatus;\n operations: number;\n /** Puntos de pausa por los que ya pasó la ejecución (ver `Machine.steps`). */\n steps: number;\n /** Nodo donde está detenida la máquina. */\n nodeId?: number;\n span?: Span;\n /** Llamadas activas, del programa principal a la más reciente. */\n frames: FrameSnapshot[];\n /** Contenido de las listas que aparecen en `frames`, por `ref`. */\n heap: Record<number, HeapEntry>;\n output: string;\n /** Estado del mundo, si la máquina corre en modo mundo. */\n world?: WorldState;\n}\n\n// ── máquina ──────────────────────────────────────────────────────────────────\n\ninterface Frame {\n chunk: Chunk;\n pc: number;\n scope: Scope;\n /** Primer alcance del marco; el que contiene a los parámetros. */\n root: Scope;\n /** Posición en la pila de valores donde empieza este marco (el procedimiento llamado está justo antes). */\n stackBase: number;\n name: string;\n callNode?: ast.Call;\n}\n\nconst DEFAULTS = {\n maxOperations: 10_000_000,\n maxCallDepth: 10_000,\n maxOutput: 1_000_000,\n};\n\nconst VISIBLE_FROM_LIBRARY = new Set<MachineEvent['type']>(['llama', 'regresa', 'imprime', 'lee', 'error', 'fin']);\n\nconst NO_COUNT = new Set<Instruction['op']>([\n 'step',\n 'enterScope',\n 'exitScope',\n 'jump',\n 'dup',\n 'pop',\n 'repeatStart',\n 'forEachStart',\n 'rangeStart',\n 'halt',\n]);\n\n/**\n * Ejecuta un programa compilado. Tiene su propia pila de llamadas, así que la recursión no depende\n * de la pila de JavaScript, y se puede pausar en cualquier sentencia o decisión.\n */\nexport class Machine {\n private readonly frames: Frame[] = [];\n private readonly stack: Value[] = [];\n private readonly natives: Record<string, NativeValue>;\n private readonly inputQueue: string[];\n private breakpoints: Set<number>;\n private readonly limits: typeof DEFAULTS;\n private readonly onEvent?: (event: MachineEvent) => void;\n private readonly outputParts: string[] = [];\n private outputLength = 0;\n private nextId = 1;\n private lastValue: Value = null;\n private inputClosed = false;\n private currentNode?: ast.Node;\n\n /** Semilla de `aleatorio` de esta ejecución (la de las opciones, o una elegida al crear la máquina). */\n readonly seed: number;\n private randomState: number;\n\n status: MachineStatus = 'lista';\n operations = 0;\n /**\n * Puntos de pausa por los que ya pasó la ejecución: cada `step()` avanza exactamente uno. Como la máquina es\n * determinista, «volver al paso n» es ejecutar otra vez desde el inicio hasta que `steps` llegue a n.\n */\n steps = 0;\n /** Por qué se detuvo la última vez que quedó `pausada`. */\n pauseReason?: 'paso' | 'presupuesto' | 'punto_de_interrupción';\n result: Value = null;\n error?: CodexivoError;\n\n constructor(\n program: Chunk,\n private readonly options: MachineOptions = {},\n ) {\n this.natives = { ...defaultNatives, ...options.world?.natives, ...options.natives };\n this.limits = {\n maxOperations: options.maxOperations ?? DEFAULTS.maxOperations,\n maxCallDepth: options.maxCallDepth ?? DEFAULTS.maxCallDepth,\n maxOutput: options.maxOutput ?? DEFAULTS.maxOutput,\n };\n this.inputQueue = typeof options.input === 'string' ? splitLines(options.input) : [...(options.input ?? [])];\n this.breakpoints = new Set(options.breakpoints ?? []);\n this.onEvent = options.onEvent;\n // Elegir la semilla es lo único que no es determinista; desde ahí, todo se puede repetir.\n this.seed = (options.seed ?? Math.floor(Math.random() * 2 ** 32)) >>> 0;\n this.randomState = this.seed;\n const globals = options.globals ?? new Scope();\n this.frames.push({ chunk: program, pc: 0, scope: globals, root: globals, stackBase: 0, name: 'programa' });\n }\n\n /** Todo lo que el programa ha impreso. */\n get output(): string {\n return this.outputParts.join('');\n }\n\n get done(): boolean {\n return this.status === 'terminada' || this.status === 'error';\n }\n\n /** Ejecuta hasta terminar, fallar, esperar entrada, llegar a un punto de interrupción o agotar `budget` operaciones. */\n run(budget = Infinity): MachineStatus {\n return this.execute('run', budget);\n }\n\n /** Ejecuta hasta la siguiente sentencia o decisión. */\n step(): MachineStatus {\n return this.execute('step', Infinity);\n }\n\n /** Cambia las líneas donde `run()` se detiene. */\n setBreakpoints(lines: number[]): void {\n this.breakpoints = new Set(lines);\n }\n\n /** Entrega una línea a un `leer()` que está esperando. */\n provideInput(line: string): void {\n this.inputQueue.push(...splitLines(line));\n if (this.status === 'esperando_entrada') this.status = 'pausada';\n }\n\n /** Indica que no habrá más entrada: desde ahora `leer()` regresa `nulo` en lugar de esperar. */\n closeInput(): void {\n this.inputClosed = true;\n if (this.status === 'esperando_entrada') this.status = 'pausada';\n }\n\n snapshot(): Snapshot {\n const heap: Record<number, HeapEntry> = {};\n const collect = (value: Value) => {\n if ((!isList(value) && !isDict(value) && !isDomain(value)) || heap[value.id]) return;\n if (isDomain(value)) {\n heap[value.id] = {\n domain: value.name,\n members: [...value.scope.variables].map(([name, member]) => ({\n name,\n value: serialize(member),\n writable: value.writable.has(name),\n })),\n };\n value.scope.variables.forEach(collect);\n } else if (isList(value)) {\n heap[value.id] = value.items.map(serialize);\n value.items.forEach(collect);\n } else {\n heap[value.id] = {\n entries: [...value.entries].map(([key, item]) => ({ key: serialize(key), value: serialize(item) })),\n };\n value.entries.forEach(collect);\n }\n };\n const frames = this.frames.map(frame => {\n const scopes: Array<Record<string, SerializedValue>> = [];\n let scope: Scope | undefined = frame.scope;\n while (scope) {\n const variables: Record<string, SerializedValue> = {};\n for (const [name, value] of scope.variables) {\n variables[name] = serialize(value);\n collect(value);\n }\n scopes.unshift(variables);\n if (scope === frame.root) break;\n scope = scope.parent;\n }\n if (frame.chunk.hidden) return { name: frame.name, callSpan: frame.callNode?.span, library: true, scopes: [] };\n return { name: frame.name, callSpan: frame.callNode?.span, scopes };\n });\n return {\n status: this.status,\n operations: this.operations,\n steps: this.steps,\n nodeId: this.currentNode?.id,\n span: this.currentNode?.span,\n frames,\n heap,\n output: this.output,\n ...(this.options.world ? { world: this.options.world.state() } : {}),\n };\n }\n\n // ── ciclo principal ────────────────────────────────────────────────────────\n\n private execute(mode: 'run' | 'step', budget: number): MachineStatus {\n if (this.done || this.status === 'esperando_entrada') return this.status;\n const stopAt = this.operations + budget;\n let executed = 0;\n\n try {\n while (true) {\n const frame = this.frames[this.frames.length - 1]!;\n const instruction = frame.chunk.code[frame.pc]!;\n\n if (!NO_COUNT.has(instruction.op) && !frame.chunk.hidden) {\n if (this.operations >= this.limits.maxOperations) {\n throw this.limitError(\n 'DEMASIADAS_OPERACIONES',\n `El programa superó el límite de ${formatCount(this.limits.maxOperations)} operaciones.`,\n '¿Hay un bucle que nunca termina? Revisa que su condición cambie en algún momento.',\n );\n }\n if (this.operations >= stopAt) {\n this.status = 'pausada';\n this.pauseReason = 'presupuesto';\n return this.status;\n }\n }\n\n // Los puntos de interrupción detienen `run()` antes de la sentencia.\n if (\n instruction.op === 'step' &&\n mode === 'run' &&\n !frame.chunk.hidden &&\n executed > 0 &&\n this.breakpoints.has(instruction.node.span.start.line)\n ) {\n this.status = 'pausada';\n this.pauseReason = 'punto_de_interrupción';\n return this.status;\n }\n\n const pause = this.exec(frame, instruction);\n executed += 1;\n // `exec` puede cambiar el estado.\n const status = this.status as MachineStatus;\n if (status === 'esperando_entrada' || status === 'terminada') return status;\n // El código de la biblioteca nunca es un punto de pausa; sí lo es el de `f` que llama.\n if (pause && !frame.chunk.hidden) {\n this.steps += 1;\n if (mode === 'step') {\n this.status = 'pausada';\n this.pauseReason = 'paso';\n return this.status;\n }\n }\n }\n } catch (error) {\n if (!(error instanceof CodexivoError)) throw error;\n this.error = error;\n this.status = 'error';\n this.emit({ type: 'error', error: error.toJSON() });\n return this.status;\n }\n }\n\n /** Ejecuta una instrucción. Regresa `true` si es un punto de pausa para `step()`. */\n private exec(frame: Frame, instruction: Instruction): boolean {\n frame.pc += 1;\n if (!NO_COUNT.has(instruction.op) && !frame.chunk.hidden) this.operations += 1;\n\n switch (instruction.op) {\n case 'step':\n if (frame.chunk.hidden) return false;\n this.currentNode = instruction.node;\n this.emit({\n type: 'paso',\n nodeId: instruction.node.id,\n nodeKind: instruction.node.kind,\n span: instruction.node.span,\n });\n return true;\n\n case 'const':\n this.stack.push(instruction.value);\n return false;\n\n case 'list': {\n const items = this.stack.splice(this.stack.length - instruction.count, instruction.count);\n this.stack.push(this.newList(items));\n return false;\n }\n\n case 'dict': {\n const values = this.stack.splice(this.stack.length - instruction.count * 2, instruction.count * 2);\n const entries = new Map<DictKey, Value>();\n instruction.node.entries.forEach((entry, index) => {\n entries.set(this.dictKey(values[index * 2]!, entry.key), values[index * 2 + 1]!);\n });\n this.stack.push(this.newDict(entries));\n return false;\n }\n\n case 'load': {\n const scope = frame.scope.lookup(instruction.name);\n if (scope) {\n this.stack.push(scope.variables.get(instruction.name)!);\n return false;\n }\n const native =\n (frame.chunk.hidden ? internals[instruction.name] : undefined) ??\n this.natives[instruction.name] ??\n libraryProcedures[instruction.name] ??\n libraryConstants[instruction.name];\n if (native !== undefined && !instruction.forUpdate) {\n this.stack.push(native);\n return false;\n }\n if (instruction.forUpdate) throw this.undeclaredAssignment(instruction.name, instruction.node);\n throw this.unknownName(frame, instruction.name, instruction.node);\n }\n\n case 'declare': {\n const value = this.stack.pop()!;\n if (frame.scope.variables.has(instruction.name) && !this.options.allowRedeclare) {\n throw this.runtimeError(\n 'VARIABLE_REPETIDA',\n `La variable \\`${instruction.name}\\` ya existe en este bloque.`,\n instruction.target,\n `Para cambiar su valor escribe \\`${instruction.name} = …\\`, sin \\`variable\\`.`,\n );\n }\n frame.scope.variables.set(instruction.name, value);\n if (instruction.constant) frame.scope.constants.add(instruction.name);\n else frame.scope.constants.delete(instruction.name);\n if (instruction.loop) frame.scope.loopVariables.add(instruction.name);\n else frame.scope.loopVariables.delete(instruction.name);\n this.emit({\n type: 'declara',\n name: instruction.name,\n constant: instruction.constant,\n value: serialize(value),\n nodeId: instruction.node.id,\n span: instruction.node.span,\n });\n return false;\n }\n\n case 'store': {\n const value = this.stack.pop()!;\n const scope = frame.scope.lookup(instruction.name);\n if (!scope) throw this.undeclaredAssignment(instruction.name, instruction.target);\n if (scope.loopVariables.has(instruction.name)) {\n throw this.runtimeError(\n 'VARIABLE_DE_PARA',\n `La variable de un \\`para\\` avanza sola; \\`${instruction.name}\\` no se puede cambiar dentro del bucle.`,\n instruction.node,\n `Si necesitas otro valor, guárdalo en una variable nueva: \\`variable otro = ${instruction.name} + 1\\`.`,\n );\n }\n if (scope.constants.has(instruction.name)) {\n if (isDomain(scope.variables.get(instruction.name)!)) {\n throw this.runtimeError(\n 'CONSTANTE_REASIGNADA',\n `\\`${instruction.name}\\` es un dominio; su nombre no se puede usar para otra cosa.`,\n instruction.node,\n `Para cambiar un miembro escribe \\`${instruction.name}.miembro = …\\`; para otro valor, usa otro nombre.`,\n );\n }\n throw this.constantReassignment(instruction.name, instruction.node);\n }\n const before = scope.variables.get(instruction.name)!;\n scope.variables.set(instruction.name, value);\n if (this.onEvent) {\n this.emit({\n type: 'asigna',\n name: instruction.name,\n before: serialize(before),\n after: serialize(value),\n nodeId: instruction.node.id,\n span: instruction.node.span,\n });\n }\n return false;\n }\n\n case 'setIndex': {\n const value = this.stack.pop()!;\n const index = this.stack.pop()!;\n const object = this.stack.pop()!;\n this.setIndex(object, index, value, instruction.target, instruction.node);\n return false;\n }\n\n case 'dup':\n this.stack.push(...this.stack.slice(this.stack.length - instruction.count));\n return false;\n\n case 'pop':\n this.stack.length -= instruction.count;\n return false;\n\n case 'result': {\n const value = this.stack.pop()!;\n if (this.frames.length === 1) this.lastValue = value;\n return false;\n }\n\n case 'unary': {\n const operand = this.stack.pop()!;\n const result = this.unary(instruction.operator, operand, instruction.node);\n this.stack.push(result);\n if (this.onEvent) this.emitOperation(instruction.operator, [operand], result, instruction.node);\n return false;\n }\n\n case 'binary': {\n const right = this.stack.pop()!;\n const left = this.stack.pop()!;\n const result = this.binary(instruction.operator, left, right, instruction.node);\n this.stack.push(result);\n if (this.onEvent) this.emitOperation(instruction.operator, [left, right], result, instruction.node);\n return false;\n }\n\n case 'index': {\n const index = this.stack.pop()!;\n const object = this.stack.pop()!;\n this.stack.push(this.index(object, index, instruction.node));\n return false;\n }\n\n case 'closure': {\n const procedure: ProcedureValue = {\n kind: 'procedimiento',\n id: this.nextId++,\n name: instruction.node.name,\n chunk: instruction.chunk,\n closure: frame.scope,\n };\n this.stack.push(procedure);\n return false;\n }\n\n case 'call':\n return this.call(frame, instruction.argc, instruction.node);\n\n case 'return': {\n const value = instruction.hasValue ? this.stack.pop()! : null;\n if (this.frames.length === 1) {\n this.finish(value);\n return true;\n }\n const caller = this.frames[this.frames.length - 2]!;\n if (!(frame.chunk.hidden && caller.chunk.hidden)) {\n this.emit({ type: 'regresa', name: frame.name, value: serialize(value) });\n }\n this.frames.pop();\n this.stack.length = frame.stackBase - 1;\n this.stack.push(value);\n return false;\n }\n\n case 'jump':\n frame.pc = instruction.target;\n return false;\n\n case 'branch': {\n const condition = this.stack.pop()!;\n if (typeof condition !== 'boolean')\n throw this.nonBooleanCondition(instruction.label, condition, instruction.node);\n if (!frame.chunk.hidden) this.currentNode = instruction.node;\n this.emit({\n type: 'decide',\n label: instruction.label,\n value: condition,\n nodeId: instruction.node.id,\n ownerId: instruction.owner.id,\n span: instruction.node.span,\n });\n if (condition === instruction.jumpWhen) frame.pc = instruction.target;\n return true;\n }\n\n case 'repeatStart': {\n const count = this.stack[this.stack.length - 1]!;\n if (typeof count !== 'number' || !Number.isInteger(count) || count < 0) {\n throw this.invalidRepeatCount(count, instruction.node);\n }\n return false;\n }\n\n case 'repeatNext': {\n const remaining = this.stack[this.stack.length - 1] as number;\n const again = remaining > 0;\n if (again) this.stack[this.stack.length - 1] = remaining - 1;\n else this.stack.pop();\n if (!frame.chunk.hidden) this.currentNode = instruction.node;\n this.emit({\n type: 'decide',\n label: 'repetir',\n value: again,\n nodeId: instruction.node.id,\n ownerId: instruction.owner.id,\n span: instruction.node.span,\n });\n if (!again) frame.pc = instruction.target;\n return true;\n }\n\n case 'rangeStart': {\n const step = this.stack.pop()!;\n const to = this.stack.pop()!;\n const from = this.stack.pop()!;\n const { owner } = instruction;\n const checkNumber = (value: Value, node: ast.Node, what: string): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n throw this.runtimeError(\n 'PARA_LÍMITE_INVÁLIDO',\n `${what} de \\`para\\` tiene que ser un número, pero es ${repr(value)}.`,\n node,\n typeof value === 'string' ? 'Convierte el texto con `número(…)`.' : undefined,\n );\n };\n const start = checkNumber(from, owner.from, 'El inicio');\n const end = checkNumber(to, owner.to, 'El final');\n const increment = checkNumber(step, owner.step ?? owner, 'El paso');\n if (increment === 0) {\n throw this.runtimeError(\n 'PARA_PASO_CERO',\n 'El paso de un `para` no puede ser 0: nunca llegaría al final.',\n owner.step ?? owner,\n 'Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n );\n }\n if ((end - start) * increment < 0) {\n // Sin magia: no se invierte solo ni hace cero vueltas en silencio.\n throw this.runtimeError(\n 'PARA_SENTIDO_CONTRARIO',\n increment > 0\n ? `El \\`para\\` empieza en ${repr(start)}, que es mayor que ${repr(end)}, y cuenta hacia arriba.`\n : `El \\`para\\` empieza en ${repr(start)}, que es menor que ${repr(end)}, y cuenta hacia abajo.`,\n instruction.explicitStep ? owner.step! : owner.to,\n instruction.explicitStep\n ? `Para ir de ${repr(start)} a ${repr(end)} el paso tiene que ser ${increment > 0 ? 'negativo' : 'positivo'}.`\n : 'Para contar hacia atrás escribe `con_paso -1`.',\n );\n }\n // Se tolera un error de redondeo pequeño para que `desde 0 hasta 1 con_paso 0.1` incluya el 1.\n const count = Math.floor((end - start) / increment + 1e-9) + 1;\n this.stack.push(start, increment, count, 0);\n return false;\n }\n\n case 'rangeNext': {\n const turn = this.stack[this.stack.length - 1] as number;\n const count = this.stack[this.stack.length - 2] as number;\n const again = turn < count;\n if (again) {\n const start = this.stack[this.stack.length - 4] as number;\n const increment = this.stack[this.stack.length - 3] as number;\n this.stack[this.stack.length - 1] = turn + 1;\n // Se calcula desde el inicio (no sumando) y con 15 cifras, así `0.1 * 3` se ve como 0.3.\n this.stack.push(Number((start + turn * increment).toPrecision(15)));\n } else {\n this.stack.length -= 4;\n }\n if (!frame.chunk.hidden) this.currentNode = instruction.node;\n this.emit({\n type: 'decide',\n label: 'para',\n value: again,\n nodeId: instruction.node.id,\n ownerId: instruction.owner.id,\n span: instruction.node.span,\n });\n if (!again) frame.pc = instruction.target;\n return true;\n }\n\n case 'forEachStart': {\n const iterable = this.stack[this.stack.length - 1]!;\n const { owner } = instruction;\n if (isDict(iterable)) {\n // Las claves se copian al empezar; así se nota si el diccionario cambia durante el recorrido.\n const keys: ListValue = { kind: 'lista', id: 0, items: [...iterable.entries.keys()] };\n this.stack.push(keys, 0);\n return false;\n }\n if (owner.value) {\n throw this.runtimeError(\n 'PARA_CADA_INVÁLIDO',\n `\\`para_cada ${owner.variable.name}, ${owner.value.name}\\` recorre un diccionario, no ${describeType(typeOf(iterable))}.`,\n instruction.node,\n isList(iterable) || typeof iterable === 'string'\n ? `Para una lista o un texto usa una sola variable: \\`para_cada ${owner.value.name} en …\\`.`\n : undefined,\n );\n }\n if (!isList(iterable) && typeof iterable !== 'string') {\n throw this.runtimeError(\n 'PARA_CADA_INVÁLIDO',\n `\\`para_cada\\` recorre listas, textos y diccionarios, no ${describeType(typeOf(iterable))}.`,\n instruction.node,\n typeof iterable === 'number'\n ? `Para contar, recorre un rango: \\`rango(1, ${repr(iterable)})\\`.`\n : undefined,\n );\n }\n this.stack.push(isList(iterable) ? iterable.items.length : iterable.length, 0);\n return false;\n }\n\n case 'forEachNext': {\n const position = this.stack[this.stack.length - 1] as number;\n const state = this.stack[this.stack.length - 2] as number | ListValue;\n const iterable = this.stack[this.stack.length - 3] as ListValue | DictValue | string;\n const length = typeof state === 'number' ? state : state.items.length;\n if (isList(iterable) && iterable.items.length !== length) {\n throw this.runtimeError(\n 'LISTA_MODIFICADA_AL_RECORRER',\n `La lista cambió de tamaño mientras se recorría: tenía ${length} y ahora tiene ${iterable.items.length}.`,\n instruction.node,\n 'Recorre una copia o junta los cambios en otra lista y aplícalos al terminar el `para_cada`.',\n );\n }\n if (\n isDict(iterable) &&\n (iterable.entries.size !== length ||\n (position < length && !iterable.entries.has((state as ListValue).items[position] as DictKey)))\n ) {\n throw this.runtimeError(\n 'DICCIONARIO_MODIFICADO_AL_RECORRER',\n 'Se agregaron o quitaron claves del diccionario mientras se recorría.',\n instruction.node,\n 'Recorre `claves(d)`, que es una lista nueva, o junta los cambios y aplícalos al terminar.',\n );\n }\n const again = position < length;\n if (again) {\n this.stack[this.stack.length - 1] = position + 1;\n if (isDict(iterable)) {\n const key = (state as ListValue).items[position] as DictKey;\n if (instruction.owner.value) this.stack.push(iterable.entries.get(key)!);\n this.stack.push(key);\n } else {\n this.stack.push(isList(iterable) ? iterable.items[position]! : iterable[position]!);\n }\n } else {\n this.stack.length -= 3;\n }\n if (!frame.chunk.hidden) this.currentNode = instruction.node;\n this.emit({\n type: 'decide',\n label: 'para_cada',\n value: again,\n nodeId: instruction.node.id,\n ownerId: instruction.owner.id,\n span: instruction.node.span,\n });\n if (!again) frame.pc = instruction.target;\n return true;\n }\n\n case 'shortCircuit': {\n const left = this.stack[this.stack.length - 1]!;\n if (typeof left !== 'boolean') throw this.nonBooleanLogical(instruction.node, left, instruction.node.left);\n const decided = instruction.node.operator === 'y' ? left === false : left === true;\n if (decided) {\n frame.pc = instruction.target;\n if (this.onEvent) this.emitOperation(instruction.node.operator, [left], left, instruction.node);\n } else {\n this.stack.pop();\n }\n return false;\n }\n\n case 'checkLogical': {\n const right = this.stack[this.stack.length - 1]!;\n if (typeof right !== 'boolean') throw this.nonBooleanLogical(instruction.node, right, instruction.node.right);\n if (this.onEvent) {\n const left = instruction.node.operator === 'y';\n this.emitOperation(instruction.node.operator, [left, right], right, instruction.node);\n }\n return false;\n }\n\n case 'enterScope':\n case 'domainStart':\n frame.scope = new Scope(frame.scope);\n return false;\n\n case 'domainEnd': {\n const domain: DomainValue = {\n kind: 'dominio',\n id: this.nextId++,\n name: instruction.name,\n scope: frame.scope,\n writable: new Set(instruction.writable),\n };\n frame.scope = frame.scope.parent ?? frame.scope;\n if (frame.scope.variables.has(instruction.name) && !this.options.allowRedeclare) {\n throw this.runtimeError(\n 'VARIABLE_REPETIDA',\n `Ya existe algo llamado \\`${instruction.name}\\` en este bloque.`,\n instruction.node.name,\n 'Cada dominio necesita un nombre propio en su bloque.',\n );\n }\n // El nombre de un dominio no se reasigna: siempre se refiere al mismo espacio de nombres.\n frame.scope.variables.set(instruction.name, domain);\n frame.scope.constants.add(instruction.name);\n this.emit({\n type: 'declara',\n name: instruction.name,\n constant: true,\n value: serialize(domain),\n nodeId: instruction.node.id,\n span: instruction.node.span,\n });\n return false;\n }\n\n case 'exitScope':\n frame.scope = frame.scope.parent ?? frame.scope;\n return false;\n\n case 'halt':\n this.finish(this.lastValue);\n return true;\n }\n }\n\n private finish(value: Value): void {\n this.result = value;\n this.status = 'terminada';\n this.emit({ type: 'fin', result: serialize(value) });\n }\n\n // ── llamadas ───────────────────────────────────────────────────────────────\n\n private call(frame: Frame, argc: number, node: ast.Call): boolean {\n const calleeIndex = this.stack.length - argc - 1;\n const callee = this.stack[calleeIndex]!;\n const name =\n callee !== null && typeof callee === 'object' && 'name' in callee && callee.name\n ? callee.name\n : describeCallee(node);\n\n if (!isCallable(callee)) {\n throw this.runtimeError(\n 'NO_ES_PROCEDIMIENTO',\n `\\`${describeCallee(node)}\\` no es un procedimiento, es ${describeType(typeOf(callee))}.`,\n node.callee,\n );\n }\n\n const args = this.stack.slice(calleeIndex + 1);\n const expected =\n callee.kind === 'nativo'\n ? callee.arity\n : callee.chunk.minParams !== undefined\n ? ([callee.chunk.minParams, callee.chunk.params.length] as [number, number])\n : callee.chunk.params.length;\n checkArity(expected, argc, name, (message, hint) =>\n this.runtimeError(\n 'CANTIDAD_DE_ARGUMENTOS',\n message,\n node,\n hint ??\n (frame.chunk.hidden\n ? `\\`${frame.name}\\` llama al procedimiento que recibió con ${argc === 1 ? '1 valor' : `${argc} valores`}.`\n : undefined),\n ),\n );\n\n if (callee.kind === 'nativo') {\n const result = callee.call(args, this.nativeContext(node));\n if (result === WAIT_FOR_INPUT) {\n // Repetimos la llamada cuando llegue la entrada.\n frame.pc -= 1;\n if (!frame.chunk.hidden) this.operations -= 1;\n this.status = 'esperando_entrada';\n return true;\n }\n if (!frame.chunk.hidden) this.charge(callee.cost, args);\n this.stack.length = calleeIndex;\n this.stack.push(result);\n return false;\n }\n\n // El primer marco es el programa principal, no una llamada.\n if (this.frames.length - 1 >= this.limits.maxCallDepth) {\n throw this.limitError(\n 'DEMASIADAS_LLAMADAS',\n `Hay más de ${formatCount(this.limits.maxCallDepth)} llamadas anidadas.`,\n 'Si es recursión, revisa que exista un caso base que deje de llamar al procedimiento.',\n node,\n );\n }\n\n // La biblioteca cobra según la tabla de costos; dentro de ella, nada más se cobra (§10).\n if (callee.chunk.hidden && !frame.chunk.hidden) this.charge(COSTS[callee.chunk.name], args);\n const scope = new Scope(callee.closure);\n callee.chunk.params.forEach((param, index) => scope.variables.set(param, args[index] ?? null));\n if (!(frame.chunk.hidden && callee.chunk.hidden)) {\n this.emit({ type: 'llama', name, args: args.map(serialize), nodeId: node.id, span: node.span });\n }\n this.frames.push({\n chunk: callee.chunk,\n pc: 0,\n scope,\n root: scope,\n stackBase: calleeIndex + 1,\n name,\n callNode: node,\n });\n return false;\n }\n\n /** Cobra lo que cuesta un procedimiento de la biblioteca; la instrucción `call` ya contó 1. */\n private charge(cost: ((args: Value[]) => number) | undefined, args: Value[]): void {\n if (cost) this.operations += Math.max(0, cost(args) - 1);\n }\n\n private nativeContext(node: ast.Call): NativeContext {\n return {\n write: text => {\n this.outputLength += text.length;\n if (this.outputLength > this.limits.maxOutput) {\n throw this.limitError(\n 'DEMASIADA_SALIDA',\n `El programa imprimió más de ${formatCount(this.limits.maxOutput)} caracteres.`,\n '¿Hay un `imprimir` dentro de un bucle que nunca termina?',\n node,\n );\n }\n this.outputParts.push(text);\n this.emit({ type: 'imprime', text });\n },\n readLine: () => {\n if (this.inputQueue.length > 0) {\n const line = this.inputQueue.shift()!;\n this.emit({ type: 'lee', text: line });\n return line;\n }\n if (this.options.interactiveInput && !this.inputClosed) return WAIT_FOR_INPUT;\n this.emit({ type: 'lee', text: null });\n return null;\n },\n newList: items => this.newList(items),\n newDict: entries => this.newDict(entries),\n random: () => this.random(),\n fail: (code, message, hint) => this.runtimeError(code, message, node, hint),\n emit: event => this.emit({ ...event, nodeId: node.id, span: node.span }),\n };\n }\n\n private newList(items: Value[]): ListValue {\n return { kind: 'lista', id: this.nextId++, items };\n }\n\n /** mulberry32: pequeño, rápido y suficiente para ejercicios; da lo mismo en cualquier navegador. */\n private random(): number {\n this.randomState = (this.randomState + 0x6d2b79f5) >>> 0;\n let t = this.randomState;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n private newDict(entries: Map<DictKey, Value>): DictValue {\n return { kind: 'diccionario', id: this.nextId++, entries };\n }\n\n /** Revisa que `key` sirva como clave de un diccionario. */\n private dictKey(key: Value, node: { span: Span }): DictKey {\n if (typeof key === 'string' || typeof key === 'number') return key;\n throw this.runtimeError(\n 'CLAVE_INVÁLIDA',\n `Las claves de un diccionario son textos o números, no ${describeType(typeOf(key))}.`,\n node,\n );\n }\n\n // ── operadores ─────────────────────────────────────────────────────────────\n\n private unary(operator: ast.UnaryOperator, operand: Value, node: ast.Unary): Value {\n if (operator === '-') {\n if (typeof operand !== 'number') {\n throw this.runtimeError(\n 'TIPO_INVÁLIDO',\n `El signo \\`-\\` solo funciona con números, no con ${describeType(typeOf(operand))}.`,\n node,\n );\n }\n return -operand;\n }\n if (typeof operand !== 'boolean') {\n throw this.runtimeError(\n 'TIPO_INVÁLIDO',\n `\\`no\\` solo funciona con \\`verdadero\\` o \\`falso\\`, pero recibió ${repr(operand)}.`,\n node.operand,\n conditionHint(operand),\n );\n }\n return !operand;\n }\n\n private binary(\n operator: ast.BinaryOperator,\n left: Value,\n right: Value,\n node: ast.Binary | ast.Assignment | ast.Increment,\n ): Value {\n switch (operator) {\n case '==':\n return equals(left, right);\n case '!=':\n return !equals(left, right);\n case '+':\n if (typeof left === 'number' && typeof right === 'number') return left + right;\n if (typeof left === 'string' && typeof right === 'string') return left + right;\n if (typeof left === 'string' || typeof right === 'string') {\n const other = typeof left === 'string' ? right : left;\n throw this.runtimeError(\n 'TIPOS_MEZCLADOS',\n `\\`+\\` no puede unir un texto con ${describeType(typeOf(other))}.`,\n node,\n `Convierte el valor con \\`texto(…)\\`, o imprime los dos por separado: \\`imprimir(\"Total:\", ${repr(other)})\\`.`,\n );\n }\n throw this.operandError(operator, left, right, node);\n case '-':\n case '*':\n case '/':\n case 'div':\n case 'mod':\n case '^': {\n if (typeof left !== 'number' || typeof right !== 'number') throw this.operandError(operator, left, right, node);\n if (operator === '-') return left - right;\n if (operator === '*') return left * right;\n if (operator === '^') {\n const result = left ** right;\n if (Number.isNaN(result)) {\n throw this.runtimeError(\n 'POTENCIA_INVÁLIDA',\n `\\`${left < 0 ? `(${repr(left)})` : repr(left)} ^ ${repr(right)}\\` no tiene un resultado real.`,\n node,\n 'Un número negativo solo se puede elevar a un exponente entero.',\n );\n }\n return result;\n }\n if (right === 0) {\n const divisor = node.kind === 'Binary' ? node.right : node.kind === 'Assignment' ? node.value : node;\n throw this.runtimeError(\n 'DIVISIÓN_ENTRE_CERO',\n 'No se puede dividir entre cero.',\n divisor,\n 'Revisa que el divisor no valga 0 antes de dividir.',\n );\n }\n if (operator === '/') return left / right;\n // `div` y `mod` dividen hacia abajo, así `a == (a div b) * b + (a mod b)` y `-7 mod 3 == 2`.\n const quotient = Math.floor(left / right);\n return operator === 'div' ? quotient : left - right * quotient;\n }\n case '<':\n case '>':\n case '<=':\n case '>=': {\n const comparable =\n (typeof left === 'number' && typeof right === 'number') ||\n (typeof left === 'string' && typeof right === 'string');\n if (!comparable) {\n throw this.runtimeError(\n 'COMPARACIÓN_INVÁLIDA',\n `No se puede comparar ${describeType(typeOf(left))} con ${describeType(typeOf(right))} usando \\`${operator}\\`.`,\n node,\n '`<`, `>`, `<=` y `>=` comparan dos números o dos textos.',\n );\n }\n const a = left as number | string;\n const b = right as number | string;\n if (operator === '<') return a < b;\n if (operator === '>') return a > b;\n if (operator === '<=') return a <= b;\n return a >= b;\n }\n }\n }\n\n private index(object: Value, index: Value, node: ast.Index): Value {\n if (isDomain(object)) return object.scope.variables.get(this.member(object, index, node))!;\n if (isDict(object)) {\n const key = this.dictKey(index, node.index);\n if (!object.entries.has(key)) throw this.missingKey(key, node);\n return object.entries.get(key)!;\n }\n if (node.dot || (!isList(object) && typeof object !== 'string')) {\n throw this.runtimeError(\n 'ÍNDICE_NO_SOPORTADO',\n node.dot\n ? `Solo los diccionarios y los dominios tienen campos con \\`.\\`, no ${describeType(typeOf(object))}.`\n : `Solo se puede usar \\`[ ]\\` con listas, textos y diccionarios, no con ${describeType(typeOf(object))}.`,\n node.object,\n );\n }\n const position = this.position(object, index, node);\n return isList(object) ? object.items[position]! : object[position]!;\n }\n\n private setIndex(\n object: Value,\n index: Value,\n value: Value,\n target: ast.Index,\n node: ast.Assignment | ast.Increment,\n ): void {\n if (typeof object === 'string') {\n throw this.runtimeError(\n 'TEXTO_INMUTABLE',\n 'Un texto no se puede cambiar letra por letra.',\n target,\n 'Construye un texto nuevo, por ejemplo uniendo partes con `+`.',\n );\n }\n if (isDomain(object)) {\n const name = this.member(object, index, target);\n if (!object.writable.has(name)) {\n throw this.runtimeError(\n 'MIEMBRO_DE_SOLO_LECTURA',\n `\\`${object.name}.${name}\\` no se puede cambiar desde fuera del dominio.`,\n target,\n 'Desde fuera de un dominio solo se cambian sus miembros declarados con `variable`; las constantes, los procedimientos y los dominios que contiene quedan fijos.',\n );\n }\n const before = object.scope.variables.get(name)!;\n object.scope.variables.set(name, value);\n if (this.onEvent) {\n this.emit({\n type: 'asigna',\n name: `${object.name}.${name}`,\n before: serialize(before),\n after: serialize(value),\n nodeId: node.id,\n span: node.span,\n });\n }\n return;\n }\n if (target.dot && !isDict(object)) {\n throw this.runtimeError(\n 'ÍNDICE_NO_SOPORTADO',\n `Solo los diccionarios y los dominios tienen campos con \\`.\\`, no ${describeType(typeOf(object))}.`,\n target.object,\n );\n }\n if (isDict(object)) {\n const key = this.dictKey(index, target.index);\n const before = object.entries.has(key) ? object.entries.get(key)! : null;\n object.entries.set(key, value);\n this.emitModification(object, key, before, value, node);\n return;\n }\n if (!isList(object)) {\n throw this.runtimeError(\n 'ÍNDICE_NO_SOPORTADO',\n `Solo se puede cambiar un elemento de una lista o de un diccionario, no de ${describeType(typeOf(object))}.`,\n target.object,\n );\n }\n const position = this.position(object, index, target);\n const before = object.items[position]!;\n object.items[position] = value;\n this.emitModification(object, position, before, value, node);\n }\n\n private emitModification(\n object: ListValue | DictValue,\n key: DictKey,\n before: Value,\n after: Value,\n node: ast.Node,\n ): void {\n if (!this.onEvent) return;\n this.emit({\n type: 'modifica',\n ref: object.id,\n key: serialize(key),\n before: serialize(before),\n after: serialize(after),\n nodeId: node.id,\n span: node.span,\n });\n }\n\n /** El miembro de un dominio al que se refiere `dominio.miembro`; error si no existe o si se usó `[ ]`. */\n private member(domain: DomainValue, index: Value, node: ast.Index): string {\n if (!node.dot) {\n throw this.runtimeError(\n 'ÍNDICE_NO_SOPORTADO',\n `Los miembros del dominio \\`${domain.name}\\` se usan con \\`.\\`, no con \\`[ ]\\`.`,\n node,\n typeof index === 'string' && /^[\\p{L}_][\\p{L}\\d_]*$/u.test(index)\n ? `Escribe \\`${domain.name}.${index}\\`.`\n : `Por ejemplo: \\`${domain.name}.miembro\\`.`,\n );\n }\n const name = index as string;\n if (!domain.scope.variables.has(name)) {\n const suggestion = suggestName(name, [...domain.scope.variables.keys()]);\n throw this.runtimeError(\n 'MIEMBRO_INEXISTENTE',\n `El dominio \\`${domain.name}\\` no tiene nada llamado \\`${name}\\`.`,\n node.index,\n suggestion\n ? `¿Quisiste decir \\`${domain.name}.${suggestion}\\`?`\n : 'Los miembros de un dominio se declaran dentro de sus llaves; desde fuera no se pueden agregar.',\n );\n }\n return name;\n }\n\n private missingKey(key: DictKey, node: ast.Index): CodexivoError {\n const written = node.dot ? `\\`${key}\\`` : repr(key);\n return this.runtimeError(\n 'CLAVE_INEXISTENTE',\n `El diccionario no tiene la clave ${written}.`,\n node.index,\n `Usa \\`tiene(d, ${repr(key)})\\` para preguntar antes de leerla.`,\n );\n }\n\n /** Posición real de `index` (los negativos cuentan desde el final); error si no es válida. */\n private position(object: ListValue | string, index: Value, node: ast.Index): number {\n if (typeof index !== 'number' || !Number.isInteger(index)) {\n throw this.runtimeError(\n 'ÍNDICE_INVÁLIDO',\n `El índice tiene que ser un número entero, pero es ${repr(index)}.`,\n node.index,\n typeof index === 'number'\n ? 'Redondea el índice con `redondear(…)`.'\n : typeof index === 'string'\n ? 'Las claves de texto son para diccionarios; una lista se recorre con posiciones 0, 1, 2…'\n : undefined,\n );\n }\n const length = isList(object) ? object.items.length : object.length;\n const position = index < 0 ? length + index : index;\n if (position < 0 || position >= length) {\n const what = isList(object) ? 'la lista' : 'el texto';\n const unit = isList(object) ? 'elemento' : 'carácter';\n throw this.runtimeError(\n 'ÍNDICE_FUERA_DE_RANGO',\n `El índice ${index} está fuera de ${what}, que tiene ${length} ${length === 1 ? unit : unit === 'carácter' ? 'caracteres' : 'elementos'}.`,\n node.index,\n length === 0\n ? isList(object)\n ? 'La lista está vacía.'\n : 'El texto está vacío.'\n : `Los índices válidos van de 0 a ${length - 1} (o de -1 a -${length} desde el final).`,\n );\n }\n return position;\n }\n\n // ── errores ────────────────────────────────────────────────────────────────\n\n /** Nombres de las llamadas activas. Dentro de la biblioteca solo se ve el procedimiento que llamó el programa. */\n private callStack(): string[] {\n return this.frames\n .filter((frame, index) => !(frame.chunk.hidden && this.frames[index - 1]?.chunk.hidden))\n .map(frame => frame.name);\n }\n\n /**\n * El código de la biblioteca no está en el programa, así que un error ahí se ubica en la llamada del programa\n * que entró a la biblioteca (`mapear(…)`).\n */\n private visibleSpan(span: Span | undefined): Span | undefined {\n let index = this.frames.length - 1;\n if (!this.frames[index]?.chunk.hidden) return span;\n while (index > 0 && this.frames[index - 1]!.chunk.hidden) index -= 1;\n return this.frames[index]!.callNode?.span ?? span;\n }\n\n private runtimeError(code: string, message: string, node: { span: Span }, hint?: string): CodexivoError {\n return new CodexivoError({\n kind: 'ejecución',\n code,\n message,\n hint,\n span: this.visibleSpan(node.span),\n callStack: this.callStack(),\n });\n }\n\n private limitError(code: string, message: string, hint: string, node?: { span: Span }): CodexivoError {\n return new CodexivoError({\n kind: 'límite',\n code,\n message,\n hint,\n span: this.visibleSpan(node?.span ?? this.currentNode?.span),\n callStack: this.callStack(),\n });\n }\n\n private operandError(operator: string, left: Value, right: Value, node: { span: Span }): CodexivoError {\n return this.runtimeError(\n 'TIPO_INVÁLIDO',\n `\\`${operator}\\` no funciona entre ${describeType(typeOf(left))} y ${describeType(typeOf(right))}.`,\n node,\n );\n }\n\n private unknownName(frame: Frame, name: string, node: ast.Identifier): CodexivoError {\n const visible: string[] = [\n ...Object.keys(this.natives),\n ...Object.keys(libraryProcedures),\n ...Object.keys(libraryConstants),\n ];\n for (let scope: Scope | undefined = frame.scope; scope; scope = scope.parent)\n visible.push(...scope.variables.keys());\n const suggestion = suggestName(name, visible);\n return this.runtimeError(\n 'NOMBRE_DESCONOCIDO',\n `No existe nada llamado \\`${name}\\`.`,\n node,\n suggestion\n ? `¿Quisiste decir \\`${suggestion}\\`?`\n : `Si es una variable nueva, declárala con \\`variable ${name} = …\\`.`,\n );\n }\n\n private constantReassignment(name: string, node: ast.Assignment | ast.Increment): CodexivoError {\n return this.runtimeError(\n 'CONSTANTE_REASIGNADA',\n `\\`${name}\\` es una constante; su valor no puede cambiar.`,\n node,\n `Si necesitas cambiarlo, declárala con \\`variable ${name} = …\\` en lugar de \\`constante\\`.`,\n );\n }\n\n private invalidRepeatCount(count: Value, node: ast.Expression): CodexivoError {\n if (typeof count !== 'number') {\n return this.runtimeError(\n 'REPETICIONES_INVÁLIDAS',\n `\\`repetir\\` necesita un número de veces, pero recibió ${describeType(typeOf(count))} (${repr(count)}).`,\n node,\n typeof count === 'string' ? 'Convierte el texto con `número(…)`.' : undefined,\n );\n }\n return this.runtimeError(\n 'REPETICIONES_INVÁLIDAS',\n `\\`repetir\\` necesita un número entero de veces, 0 o más, pero recibió ${repr(count)}.`,\n node,\n count < 0 ? 'Revisa que la cantidad no sea negativa.' : 'Redondea la cantidad con `redondear(…)`.',\n );\n }\n\n private undeclaredAssignment(name: string, node: ast.Identifier): CodexivoError {\n if (Object.hasOwn(libraryConstants, name)) {\n return this.runtimeError(\n 'NOMBRE_RESERVADO_POR_BIBLIOTECA',\n `\\`${name}\\` es una constante de Codexivo; no se le puede asignar un valor.`,\n node,\n `Si quieres tu propia variable con ese nombre, declárala: \\`variable ${name} = …\\`.`,\n );\n }\n if (this.natives[name] || libraryProcedures[name]) {\n return this.runtimeError(\n 'NOMBRE_RESERVADO_POR_BIBLIOTECA',\n `\\`${name}\\` es un procedimiento de Codexivo; no se le puede asignar un valor.`,\n node,\n `Si quieres tu propia variable con ese nombre, declárala: \\`variable ${name} = …\\`.`,\n );\n }\n return this.runtimeError(\n 'VARIABLE_NO_DECLARADA',\n `La variable \\`${name}\\` no existe.`,\n node,\n `¿Olvidaste declararla? Escribe \\`variable ${name} = …\\` la primera vez.`,\n );\n }\n\n private nonBooleanCondition(label: DecisionLabel, value: Value, node: ast.Expression): CodexivoError {\n return this.runtimeError(\n 'CONDICIÓN_NO_LÓGICA',\n `La condición de \\`${label}\\` tiene que ser \\`verdadero\\` o \\`falso\\`, pero vale ${repr(value)}.`,\n node,\n conditionHint(value),\n );\n }\n\n private nonBooleanLogical(node: ast.Logical, value: Value, side: ast.Expression): CodexivoError {\n return this.runtimeError(\n 'OPERANDO_NO_LÓGICO',\n `\\`${node.operator}\\` une valores \\`verdadero\\` o \\`falso\\`, pero recibió ${repr(value)}.`,\n side,\n conditionHint(value),\n );\n }\n\n private emitOperation(operator: string, operands: Value[], result: Value, node: ast.Node): void {\n this.emit({\n type: 'opera',\n operator,\n operands: operands.map(serialize),\n result: serialize(result),\n nodeId: node.id,\n span: node.span,\n });\n }\n\n private emit(event: DistributiveOmit<MachineEvent, 'operations' | 'depth'>): void {\n if (!this.onEvent) return;\n // Dentro de la biblioteca solo se ven las llamadas (a `f` y de regreso), la salida, los errores y el fin.\n if (this.frames[this.frames.length - 1]?.chunk.hidden && !VISIBLE_FROM_LIBRARY.has(event.type)) return;\n this.onEvent({ ...event, operations: this.operations, depth: this.frames.length } as MachineEvent);\n }\n}\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nconst splitLines = (text: string): string[] => text.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '').split('\\n');\n\nconst formatCount = (count: number): string => count.toLocaleString('es-MX').replace(/,/g, ' ');\n\nconst describeCallee = (node: ast.Call): string => {\n const { callee } = node;\n if (callee.kind === 'Identifier') return callee.name;\n if (\n callee.kind === 'Index' &&\n callee.dot &&\n callee.object.kind === 'Identifier' &&\n callee.index.kind === 'StringLiteral'\n ) {\n return `${callee.object.name}.${callee.index.value}`;\n }\n return 'esto';\n};\n\nconst conditionHint = (value: Value): string | undefined => {\n switch (typeOf(value)) {\n case 'número':\n return `¿Quisiste comparar? Por ejemplo: \\`x es_distinto_de 0\\` o \\`x es_mayor_que 0\\`.`;\n case 'texto':\n return '¿Quisiste comparar? Por ejemplo: `texto es_distinto_de \"\"`.';\n case 'lista':\n return '¿Quisiste decir `longitud(lista) es_mayor_que 0`?';\n case 'diccionario':\n return '¿Quisiste decir `longitud(d) es_mayor_que 0` o `tiene(d, clave)`?';\n case 'nulo':\n return '¿Quisiste decir `x es_distinto_de nulo`?';\n default:\n return undefined;\n }\n};\n\nconst checkArity = (\n expected: number | [number, number],\n received: number,\n name: string,\n fail: (message: string, hint?: string) => CodexivoError,\n): void => {\n const [min, max] = typeof expected === 'number' ? [expected, expected] : expected;\n if (received >= min && received <= max) return;\n const plural = (count: number) => (count === 1 ? '1 valor' : `${count} valores`);\n let wanted: string;\n if (min === max) wanted = plural(min);\n else if (max === Infinity) wanted = `al menos ${plural(min)}`;\n else wanted = `entre ${min} y ${plural(max)}`;\n throw fail(`\\`${name}\\` espera ${wanted}, pero recibió ${received}.`);\n};\n",
|
|
16
16
|
"import type { CodexivoError, ErrorInfo } from './errors';\nimport type * as ast from './syntax/ast';\nimport { parse } from './syntax/parser';\nimport type { Token } from './syntax/token';\nimport { compile } from './runtime/compiler';\nimport { Machine } from './runtime/machine';\nimport type { MachineEvent, MachineOptions, MachineStatus } from './runtime/machine';\nimport { repr, Scope } from './runtime/values';\nimport type { Value } from './runtime/values';\nimport type { WorldState } from './world';\n\nexport interface PreparedProgram {\n program: ast.Program;\n tokens: Token[];\n /** Errores léxicos y sintácticos. Si hay alguno, `machine` no existe. */\n errors: CodexivoError[];\n machine?: Machine;\n}\n\n/** Analiza el código y, si no tiene errores, prepara una máquina lista para ejecutarlo paso a paso. */\nexport const prepare = (source: string, options: MachineOptions = {}): PreparedProgram => {\n const { program, tokens, errors } = parse(source);\n if (errors.length > 0) return { program, tokens, errors };\n return { program, tokens, errors, machine: new Machine(compile(program), options) };\n};\n\nexport interface RunOptions extends Omit<MachineOptions, 'onEvent'> {\n /** Guarda los eventos de la ejecución en `events`. */\n trace?: boolean;\n /** Máximo de eventos a guardar con `trace`. Por defecto 100 000. */\n maxEvents?: number;\n}\n\nexport interface RunResult {\n status: MachineStatus;\n /** `true` si el programa terminó sin errores. */\n ok: boolean;\n /** Valor de la última expresión del programa, o lo que regresó con `regresa`. */\n result: Value;\n /** `result` como se escribiría en código. */\n resultText: string;\n output: string;\n errors: ErrorInfo[];\n operations: number;\n /** Semilla de `aleatorio` que usó la ejecución; pásala en `seed` para repetirla. */\n seed?: number;\n /** Estado final del mundo, si se ejecutó en modo mundo. */\n world?: WorldState;\n events?: MachineEvent[];\n /** `true` si se guardaron menos eventos de los que ocurrieron. */\n eventsTruncated?: boolean;\n}\n\n/** Ejecuta un programa completo. */\nexport const run = (source: string, options: RunOptions = {}): RunResult => {\n const { trace, maxEvents = 100_000, ...machineOptions } = options;\n const events: MachineEvent[] = [];\n let eventsTruncated = false;\n const onEvent = trace\n ? (event: MachineEvent) => {\n if (events.length < maxEvents) events.push(event);\n else eventsTruncated = true;\n }\n : undefined;\n\n const { errors, machine } = prepare(source, { ...machineOptions, onEvent });\n if (!machine) {\n return {\n status: 'error',\n ok: false,\n result: null,\n resultText: 'nulo',\n output: '',\n errors: errors.map(error => error.toJSON()),\n operations: 0,\n ...(trace ? { events, eventsTruncated } : {}),\n };\n }\n\n machine.run();\n return {\n status: machine.status,\n ok: machine.status === 'terminada',\n result: machine.result,\n resultText: repr(machine.result),\n output: machine.output,\n errors: machine.error ? [machine.error.toJSON()] : [],\n operations: machine.operations,\n seed: machine.seed,\n ...(options.world ? { world: options.world.state() } : {}),\n ...(trace ? { events, eventsTruncated } : {}),\n };\n};\n\n/** Varias ejecuciones que comparten variables, como en el REPL. */\nexport class Session {\n private readonly globals = new Scope();\n\n constructor(private readonly options: Omit<RunOptions, 'globals' | 'allowRedeclare'> = {}) {}\n\n run(source: string): RunResult {\n return run(source, { ...this.options, globals: this.globals, allowRedeclare: true });\n }\n}\n",
|
|
17
17
|
"import type { Span } from './token';\n\n/**\n * El AST está hecho de objetos planos: se puede serializar, enviar a un Web Worker y dibujar sin\n * perder información. Cada nodo tiene un `id` único dentro de su programa y su rango en el código.\n */\ninterface BaseNode {\n id: number;\n span: Span;\n}\n\n/** `%` y `mod` son el mismo operador; en el AST siempre aparece como `mod`. */\nexport type BinaryOperator = '+' | '-' | '*' | '/' | 'div' | 'mod' | '^' | '==' | '!=' | '<' | '>' | '<=' | '>=';\nexport type LogicalOperator = 'y' | 'o';\nexport type UnaryOperator = '-' | 'no';\nexport type AssignmentOperator = '=' | '+=' | '-=' | '*=' | '/=' | '%=';\nexport type IncrementOperator = '++' | '--';\n\n// ── expresiones ──────────────────────────────────────────────────────────────\n\nexport interface NumberLiteral extends BaseNode {\n kind: 'NumberLiteral';\n value: number;\n}\n\nexport interface StringLiteral extends BaseNode {\n kind: 'StringLiteral';\n value: string;\n}\n\nexport interface BooleanLiteral extends BaseNode {\n kind: 'BooleanLiteral';\n value: boolean;\n}\n\nexport interface NullLiteral extends BaseNode {\n kind: 'NullLiteral';\n}\n\nexport interface ListLiteral extends BaseNode {\n kind: 'ListLiteral';\n elements: Expression[];\n}\n\nexport interface Identifier extends BaseNode {\n kind: 'Identifier';\n name: string;\n}\n\nexport interface Unary extends BaseNode {\n kind: 'Unary';\n operator: UnaryOperator;\n operand: Expression;\n}\n\nexport interface Binary extends BaseNode {\n kind: 'Binary';\n operator: BinaryOperator;\n left: Expression;\n right: Expression;\n}\n\n/** `y` / `o`: se evalúan en cortocircuito, por eso no son un `Binary`. */\nexport interface Logical extends BaseNode {\n kind: 'Logical';\n operator: LogicalOperator;\n left: Expression;\n right: Expression;\n}\n\nexport interface Call extends BaseNode {\n kind: 'Call';\n callee: Expression;\n args: Expression[];\n}\n\nexport interface Index extends BaseNode {\n kind: 'Index';\n object: Expression;\n index: Expression;\n /** `true` si se escribió `d.campo`; entonces `index` es el texto `\"campo\"`. */\n dot?: boolean;\n}\n\nexport interface DictEntry {\n /** Rango de `clave: valor`. */\n span: Span;\n key: Expression;\n value: Expression;\n}\n\nexport interface DictLiteral extends BaseNode {\n kind: 'DictLiteral';\n entries: DictEntry[];\n}\n\nexport interface FunctionLiteral extends BaseNode {\n kind: 'FunctionLiteral';\n /** Nombre con el que se declaró, si se conoce (`variable doble = procedimiento…` → `doble`). */\n name?: string;\n params: Identifier[];\n body: Block;\n}\n\nexport type Expression =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | ListLiteral\n | DictLiteral\n | Identifier\n | Unary\n | Binary\n | Logical\n | Call\n | Index\n | FunctionLiteral;\n\n// ── sentencias ───────────────────────────────────────────────────────────────\n\nexport interface VariableDeclaration extends BaseNode {\n kind: 'VariableDeclaration';\n /** `true` si se declaró con `constante`: no se puede reasignar. */\n constant: boolean;\n name: Identifier;\n value: Expression;\n}\n\n/** Lo que puede ir a la izquierda de `=`: una variable o un elemento (`lista[i]`). */\nexport type AssignmentTarget = Identifier | Index;\n\nexport interface Assignment extends BaseNode {\n kind: 'Assignment';\n target: AssignmentTarget;\n operator: AssignmentOperator;\n value: Expression;\n}\n\n/** `i++` / `i--`: son sentencias, no expresiones. */\nexport interface Increment extends BaseNode {\n kind: 'Increment';\n target: AssignmentTarget;\n operator: IncrementOperator;\n}\n\n/** `procedimiento nombre(…) { … }`: se puede usar desde el inicio de su bloque. */\nexport interface FunctionDeclaration extends BaseNode {\n kind: 'FunctionDeclaration';\n name: Identifier;\n function: FunctionLiteral;\n}\n\nexport interface ExpressionStatement extends BaseNode {\n kind: 'ExpressionStatement';\n expression: Expression;\n}\n\nexport interface Return extends BaseNode {\n kind: 'Return';\n value?: Expression;\n}\n\nexport interface Block extends BaseNode {\n kind: 'Block';\n statements: Statement[];\n}\n\nexport interface IfBranch {\n /** Rango de la rama completa: desde `si` / `pero_si` hasta su `}`. */\n span: Span;\n condition: Expression;\n body: Block;\n}\n\n/** `si … pero_si … si_no`: las ramas se guardan en orden, no anidadas. */\nexport interface If extends BaseNode {\n kind: 'If';\n branches: IfBranch[];\n alternative?: Block;\n}\n\nexport interface While extends BaseNode {\n kind: 'While';\n condition: Expression;\n body: Block;\n}\n\n/** `hacer { … } hasta_que (condición)`: repite el cuerpo hasta que la condición sea verdadera. */\nexport interface DoUntil extends BaseNode {\n kind: 'DoUntil';\n body: Block;\n condition: Expression;\n}\n\nexport interface For extends BaseNode {\n kind: 'For';\n init?: VariableDeclaration | Assignment | Increment | ExpressionStatement;\n condition?: Expression;\n update?: Assignment | Increment | ExpressionStatement;\n body: Block;\n}\n\n/**\n * `para i desde a hasta b con_paso p { … }`: cuenta de `a` a `b`, incluidos los dos. Los límites y el paso se\n * evalúan una vez, al empezar; `i` es nueva en cada vuelta y no se puede cambiar dentro del cuerpo.\n */\nexport interface ForRange extends BaseNode {\n kind: 'ForRange';\n variable: Identifier;\n from: Expression;\n to: Expression;\n step?: Expression;\n body: Block;\n}\n\n/** `repetir n veces { … }`: el contador es interno, no una variable visible. */\nexport interface Repeat extends BaseNode {\n kind: 'Repeat';\n count: Expression;\n body: Block;\n}\n\n/** `para_cada x en lista { … }`: recorre una lista o un texto. */\nexport interface ForEach extends BaseNode {\n kind: 'ForEach';\n variable: Identifier;\n /** Segunda variable de `para_cada clave, valor en diccionario`. */\n value?: Identifier;\n iterable: Expression;\n body: Block;\n}\n\n/**\n * `dominio nombre { … }`: un espacio de nombres. Agrupa declaraciones (variables, constantes, procedimientos y\n * otros dominios) que se usan desde fuera con `nombre.miembro`. No es un módulo: no hay `importar`.\n */\nexport interface Domain extends BaseNode {\n kind: 'Domain';\n name: Identifier;\n body: Block;\n}\n\nexport interface Break extends BaseNode {\n kind: 'Break';\n}\n\nexport interface Continue extends BaseNode {\n kind: 'Continue';\n}\n\nexport type Statement =\n | VariableDeclaration\n | FunctionDeclaration\n | Assignment\n | Increment\n | ExpressionStatement\n | Return\n | Block\n | If\n | While\n | DoUntil\n | For\n | ForRange\n | ForEach\n | Repeat\n | Break\n | Continue\n | Domain;\n\nexport interface Program extends BaseNode {\n kind: 'Program';\n statements: Statement[];\n}\n\nexport type Node = Program | Statement | Expression;\n\n/** Hijos directos de un nodo, en el orden en que aparecen en el código. */\nexport const childrenOf = (node: Node): Node[] => {\n switch (node.kind) {\n case 'Program':\n case 'Block':\n return node.statements;\n case 'ListLiteral':\n return node.elements;\n case 'DictLiteral':\n return node.entries.flatMap(entry => [entry.key, entry.value]);\n case 'Unary':\n return [node.operand];\n case 'Binary':\n case 'Logical':\n return [node.left, node.right];\n case 'Call':\n return [node.callee, ...node.args];\n case 'Index':\n return [node.object, node.index];\n case 'FunctionLiteral':\n return [...node.params, node.body];\n case 'VariableDeclaration':\n return [node.name, node.value];\n case 'Assignment':\n return [node.target, node.value];\n case 'Increment':\n return [node.target];\n case 'FunctionDeclaration':\n return [node.name, node.function];\n case 'ForEach':\n return [node.variable, ...(node.value ? [node.value] : []), node.iterable, node.body];\n case 'ExpressionStatement':\n return [node.expression];\n case 'Return':\n return node.value ? [node.value] : [];\n case 'If':\n return [\n ...node.branches.flatMap(branch => [branch.condition, branch.body]),\n ...(node.alternative ? [node.alternative] : []),\n ];\n case 'While':\n return [node.condition, node.body];\n case 'DoUntil':\n return [node.body, node.condition];\n case 'Domain':\n return [node.name, node.body];\n case 'ForRange':\n return [node.variable, node.from, node.to, ...(node.step ? [node.step] : []), node.body];\n case 'Repeat':\n return [node.count, node.body];\n case 'For':\n return [\n ...(node.init ? [node.init] : []),\n ...(node.condition ? [node.condition] : []),\n ...(node.update ? [node.update] : []),\n node.body,\n ];\n default:\n return [];\n }\n};\n\n/** Recorre el árbol en profundidad, del padre a los hijos. */\nexport const walk = (node: Node, visit: (node: Node, parent?: Node) => void, parent?: Node): void => {\n visit(node, parent);\n for (const child of childrenOf(node)) walk(child, visit, node);\n};\n",
|
|
18
18
|
"import type { NativeContext, NativeValue, ProcedureDoc } from './runtime/values';\n\n/**\n * Modo mundo: el mismo lenguaje con procedimientos para mover un robot en una cuadrícula, como Karel.\n * Este módulo define el formato del mundo, sus reglas y sus eventos; el sitio solo lo dibuja.\n *\n * Coordenadas: `x` crece hacia el este y `y` hacia el norte; la casilla de la esquina suroeste es (1, 1).\n */\n\nexport type Direction = 'norte' | 'este' | 'sur' | 'oeste';\n\n/** Una cantidad de zumbadores: un entero ≥ 0 o `'infinito'` (JSON no tiene `Infinity`). */\nexport type BeeperCount = number | 'infinito';\n\n/** Pared en el lado `side` de la casilla (x, y). La misma pared es el lado opuesto de la casilla vecina. */\nexport interface Wall {\n x: number;\n y: number;\n side: Direction;\n}\n\nexport interface BeeperPile {\n x: number;\n y: number;\n count: BeeperCount;\n}\n\nexport interface Robot {\n x: number;\n y: number;\n facing: Direction;\n /** Zumbadores en la mochila. */\n beepers: BeeperCount;\n}\n\n/** Formato de un mundo, versión 1. Es el que guardan el editor de mundos y los retos del sitio. */\nexport interface WorldDefinition {\n version: 1;\n /** Casillas de oeste a este. */\n width: number;\n /** Casillas de sur a norte. */\n height: number;\n walls?: Wall[];\n beepers?: BeeperPile[];\n robot: Robot;\n}\n\n/**\n * Estado de un mundo en un momento dado. Tiene el mismo formato que `WorldDefinition` (se puede usar como\n * mundo inicial de otra ejecución), más si el robot sigue encendido. Las paredes salen normalizadas: solo\n * lados `norte` y `este`, sin repetir, y sin los bordes de la cuadrícula.\n */\nexport interface WorldState extends Required<WorldDefinition> {\n robot: Robot & { on: boolean };\n}\n\nexport interface WorldValidationError {\n /** Dónde está el problema, como `robot.x` o `walls[2].side`. */\n path: string;\n message: string;\n}\n\nexport const DIRECTIONS: readonly Direction[] = ['norte', 'este', 'sur', 'oeste'];\n\nconst MAX_SIZE = 100;\n\n// ── validación ───────────────────────────────────────────────────────────────\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/**\n * Revisa que `input` (por ejemplo, el resultado de `JSON.parse`) sea un mundo válido. Nunca lanza: regresa el\n * mundo o la lista de problemas, con mensajes para quien edita el mundo.\n */\nexport const validateWorld = (\n input: unknown,\n): { world: WorldDefinition; errors: [] } | { world?: undefined; errors: WorldValidationError[] } => {\n const errors: WorldValidationError[] = [];\n const fail = (path: string, message: string) => errors.push({ path, message });\n\n if (!isObject(input)) {\n fail('', 'El mundo tiene que ser un objeto JSON.');\n return { errors };\n }\n if (input.version !== 1) {\n fail('version', `La versión del formato tiene que ser 1, pero es ${JSON.stringify(input.version)}.`);\n }\n\n const size = (key: 'width' | 'height', what: string): number => {\n const value = input[key];\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1 || value > MAX_SIZE) {\n fail(\n key,\n `\\`${key}\\` (${what}) tiene que ser un entero entre 1 y ${MAX_SIZE}, pero es ${JSON.stringify(value)}.`,\n );\n return 0;\n }\n return value;\n };\n const width = size('width', 'casillas de oeste a este');\n const height = size('height', 'casillas de sur a norte');\n\n const position = (value: Record<string, unknown>, path: string) => {\n for (const [axis, limit] of [\n ['x', width],\n ['y', height],\n ] as const) {\n const coordinate = value[axis];\n if (typeof coordinate !== 'number' || !Number.isInteger(coordinate)) {\n fail(\n `${path}.${axis}`,\n `\\`${path}.${axis}\\` tiene que ser un número entero, pero es ${JSON.stringify(coordinate)}.`,\n );\n } else if (limit > 0 && (coordinate < 1 || coordinate > limit)) {\n fail(`${path}.${axis}`, `\\`${path}.${axis}\\` tiene que estar entre 1 y ${limit}, pero es ${coordinate}.`);\n }\n }\n };\n const direction = (value: unknown, path: string) => {\n if (!DIRECTIONS.includes(value as Direction)) {\n fail(path, `\\`${path}\\` tiene que ser \"norte\", \"este\", \"sur\" u \"oeste\", pero es ${JSON.stringify(value)}.`);\n }\n };\n const count = (value: unknown, path: string) => {\n if (value === 'infinito') return;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n fail(\n path,\n `\\`${path}\\` tiene que ser un entero de 0 en adelante o \"infinito\", pero es ${JSON.stringify(value)}.`,\n );\n }\n };\n const list = (key: 'walls' | 'beepers', check: (item: Record<string, unknown>, path: string) => void) => {\n const value = input[key];\n if (value === undefined) return;\n if (!Array.isArray(value)) {\n fail(key, `\\`${key}\\` tiene que ser una lista.`);\n return;\n }\n value.forEach((item, index) => {\n const path = `${key}[${index}]`;\n if (!isObject(item)) fail(path, `\\`${path}\\` tiene que ser un objeto.`);\n else check(item, path);\n });\n };\n\n list('walls', (wall, path) => {\n position(wall, path);\n direction(wall.side, `${path}.side`);\n });\n const piles = new Set<string>();\n list('beepers', (pile, path) => {\n position(pile, path);\n count(pile.count, `${path}.count`);\n const key = `${pile.x},${pile.y}`;\n if (piles.has(key)) fail(path, `La casilla (${pile.x}, ${pile.y}) aparece dos veces en \\`beepers\\`.`);\n piles.add(key);\n });\n\n if (!isObject(input.robot)) {\n fail('robot', 'Falta `robot`, con su posición, orientación y zumbadores.');\n } else {\n position(input.robot, 'robot');\n direction(input.robot.facing, 'robot.facing');\n count(input.robot.beepers, 'robot.beepers');\n }\n\n if (errors.length > 0) return { errors };\n return { world: input as unknown as WorldDefinition, errors: [] };\n};\n\n// ── mundo en ejecución ───────────────────────────────────────────────────────\n\nconst LEFT: Record<Direction, Direction> = { norte: 'oeste', oeste: 'sur', sur: 'este', este: 'norte' };\nconst RIGHT: Record<Direction, Direction> = { norte: 'este', este: 'sur', sur: 'oeste', oeste: 'norte' };\nconst STEP: Record<Direction, [number, number]> = { norte: [0, 1], este: [1, 0], sur: [0, -1], oeste: [-1, 0] };\n\nconst toNumber = (count: BeeperCount): number => (count === 'infinito' ? Infinity : count);\nconst toCount = (value: number): BeeperCount => (value === Infinity ? 'infinito' : value);\n\n/** Lo que el evento `robot` dice del robot antes y después de una acción. */\nexport interface RobotSnapshot {\n x: number;\n y: number;\n facing: Direction;\n beepers: BeeperCount;\n on: boolean;\n}\n\nexport type RobotAction = 'avanzar' | 'girar_izquierda' | 'recoger_zumbador' | 'dejar_zumbador' | 'apagar';\n\n/** Evento `robot`: uno por acción, para que el sitio anime sin recalcular nada. */\nexport interface RobotEvent {\n type: 'robot';\n action: RobotAction;\n before: RobotSnapshot;\n after: RobotSnapshot;\n /** Zumbadores que quedaron en la casilla, en `recoger_zumbador` y `dejar_zumbador`. */\n cell?: { x: number; y: number; beepers: BeeperCount };\n}\n\nexport interface World {\n /** Procedimientos del modo mundo; se pasan a la máquina (lo hace `MachineOptions.world`). */\n natives: Record<string, NativeValue>;\n /** Estado actual del mundo, serializable. */\n state(): WorldState;\n}\n\n/**\n * Crea un mundo listo para una ejecución. Lanza un `Error` si la definición no es válida; usa `validateWorld`\n * antes para mostrar los problemas a quien editó el mundo.\n */\nexport const createWorld = (definition: WorldDefinition): World => {\n const { world, errors } = validateWorld(definition);\n if (!world) throw new Error(`El mundo no es válido: ${errors.map(error => error.message).join(' ')}`);\n\n const { width, height } = world;\n const walls = new Set<string>();\n const wallKey = (x: number, y: number, side: Direction): string => {\n // Cada pared se guarda como el lado norte o este de una casilla.\n if (side === 'sur') return `n:${x}:${y - 1}`;\n if (side === 'oeste') return `e:${x - 1}:${y}`;\n return `${side === 'norte' ? 'n' : 'e'}:${x}:${y}`;\n };\n for (const wall of world.walls ?? []) walls.add(wallKey(wall.x, wall.y, wall.side));\n\n const beepers = new Map<string, number>();\n for (const pile of world.beepers ?? []) {\n if (toNumber(pile.count) > 0) beepers.set(`${pile.x},${pile.y}`, toNumber(pile.count));\n }\n\n const robot = { ...world.robot, beepers: toNumber(world.robot.beepers), on: true };\n\n const isOpen = (x: number, y: number, side: Direction): boolean => {\n const [dx, dy] = STEP[side];\n const nx = x + dx;\n const ny = y + dy;\n if (nx < 1 || ny < 1 || nx > width || ny > height) return false;\n return !walls.has(wallKey(x, y, side));\n };\n\n const snapshotRobot = (): RobotSnapshot => ({\n x: robot.x,\n y: robot.y,\n facing: robot.facing,\n beepers: toCount(robot.beepers),\n on: robot.on,\n });\n const where = () => `El robot está en (${robot.x}, ${robot.y}) mirando al ${robot.facing}.`;\n\n const action = (name: RobotAction, run: (context: NativeContext) => RobotEvent['cell'] | void): NativeValue => ({\n kind: 'nativo',\n name,\n arity: 0,\n doc: worldDocs[name]!,\n call: (_args, context) => {\n if (!robot.on) {\n throw context.fail(\n 'ROBOT_APAGADO',\n `El robot ya está apagado; no puede \\`${name}\\`.`,\n '`apagar()` va al final: después de apagarlo, el robot ya no hace nada.',\n );\n }\n const before = snapshotRobot();\n const cell = run(context);\n context.emit({ type: 'robot', action: name, before, after: snapshotRobot(), ...(cell ? { cell } : {}) });\n return null;\n },\n });\n const question = (name: string, answer: () => boolean): NativeValue => ({\n kind: 'nativo',\n name,\n arity: 0,\n doc: worldDocs[name]!,\n call: answer,\n });\n\n const actions: NativeValue[] = [\n action('avanzar', context => {\n if (!isOpen(robot.x, robot.y, robot.facing)) {\n const [dx, dy] = STEP[robot.facing];\n const edge = robot.x + dx < 1 || robot.y + dy < 1 || robot.x + dx > width || robot.y + dy > height;\n throw context.fail(\n 'CHOQUE_CON_PARED',\n `El robot chocó con ${edge ? 'el borde del mundo' : 'una pared'}. ${where()}`,\n 'Pregunta antes con `frente_libre()`.',\n );\n }\n const [dx, dy] = STEP[robot.facing];\n robot.x += dx;\n robot.y += dy;\n }),\n action('girar_izquierda', () => {\n robot.facing = LEFT[robot.facing];\n }),\n action('recoger_zumbador', context => {\n const key = `${robot.x},${robot.y}`;\n const here = beepers.get(key) ?? 0;\n if (here === 0) {\n throw context.fail(\n 'SIN_ZUMBADORES',\n `No hay zumbadores que recoger. ${where()}`,\n 'Pregunta antes con `hay_zumbador()`.',\n );\n }\n if (here !== Infinity) {\n if (here === 1) beepers.delete(key);\n else beepers.set(key, here - 1);\n }\n if (robot.beepers !== Infinity) robot.beepers += 1;\n return { x: robot.x, y: robot.y, beepers: toCount(beepers.get(key) ?? 0) };\n }),\n action('dejar_zumbador', context => {\n if (robot.beepers === 0) {\n throw context.fail(\n 'MOCHILA_VACÍA',\n `El robot no tiene zumbadores que dejar. ${where()}`,\n 'Pregunta antes con `tengo_zumbadores()`.',\n );\n }\n if (robot.beepers !== Infinity) robot.beepers -= 1;\n const key = `${robot.x},${robot.y}`;\n const here = beepers.get(key) ?? 0;\n if (here !== Infinity) beepers.set(key, here + 1);\n return { x: robot.x, y: robot.y, beepers: toCount(beepers.get(key)!) };\n }),\n action('apagar', () => {\n robot.on = false;\n }),\n question('frente_libre', () => isOpen(robot.x, robot.y, robot.facing)),\n question('izquierda_libre', () => isOpen(robot.x, robot.y, LEFT[robot.facing])),\n question('derecha_libre', () => isOpen(robot.x, robot.y, RIGHT[robot.facing])),\n question('hay_zumbador', () => (beepers.get(`${robot.x},${robot.y}`) ?? 0) > 0),\n question('tengo_zumbadores', () => robot.beepers > 0),\n ...DIRECTIONS.map(direction => question(`mirando_al_${direction}`, () => robot.facing === direction)),\n ];\n\n const state = (): WorldState => {\n const normalized: Wall[] = [...walls]\n .map(key => {\n const [kind, x, y] = key.split(':');\n return { x: Number(x), y: Number(y), side: kind === 'n' ? ('norte' as const) : ('este' as const) };\n })\n .filter(wall =>\n wall.side === 'norte'\n ? wall.y >= 1 && wall.y < height && wall.x >= 1\n : wall.x >= 1 && wall.x < width && wall.y >= 1,\n )\n .sort((a, b) => a.y - b.y || a.x - b.x || a.side.localeCompare(b.side));\n const piles: BeeperPile[] = [...beepers]\n .map(([key, count]) => {\n const [x, y] = key.split(',').map(Number) as [number, number];\n return { x, y, count: toCount(count) };\n })\n .sort((a, b) => a.y - b.y || a.x - b.x);\n return {\n version: 1,\n width,\n height,\n walls: normalized,\n beepers: piles,\n robot: { x: robot.x, y: robot.y, facing: robot.facing, beepers: toCount(robot.beepers), on: robot.on },\n };\n };\n\n return { natives: Object.fromEntries(actions.map(native => [native.name, native])), state };\n};\n\n// ── documentación ────────────────────────────────────────────────────────────\n\n/** Mundo con el que se ejecutan los ejemplos del catálogo del modo mundo. */\nexport const EXAMPLE_WORLD: WorldDefinition = {\n version: 1,\n width: 3,\n height: 3,\n walls: [{ x: 1, y: 1, side: 'este' }],\n beepers: [{ x: 1, y: 1, count: 2 }],\n robot: { x: 1, y: 1, facing: 'norte', beepers: 1 },\n};\n\nconst worldDoc = (description: string, code: string, result: string, question = false): ProcedureDoc => ({\n level: 'principiante',\n category: 'mundo',\n params: [],\n returns: question ? 'lógico' : 'nulo',\n description,\n examples: [{ code, result }],\n});\n\n/** Documentación de los procedimientos del modo mundo, para el catálogo. */\nexport const worldDocs: Readonly<Record<string, ProcedureDoc>> = {\n avanzar: worldDoc(\n 'Avanza una casilla hacia donde mira el robot. Chocar con una pared es un error.',\n 'avanzar()\\nmirando_al_norte()',\n 'verdadero',\n ),\n girar_izquierda: worldDoc('Gira 90° a la izquierda.', 'girar_izquierda()\\nmirando_al_oeste()', 'verdadero'),\n recoger_zumbador: worldDoc(\n 'Toma un zumbador de la casilla y lo guarda en la mochila.',\n 'recoger_zumbador()\\nhay_zumbador()',\n 'verdadero',\n ),\n dejar_zumbador: worldDoc(\n 'Deja un zumbador de la mochila en la casilla.',\n 'dejar_zumbador()\\ntengo_zumbadores()',\n 'falso',\n ),\n apagar: worldDoc(\n 'Apaga el robot. Después ya no puede hacer ninguna acción.',\n 'apagar()\\nfrente_libre()',\n 'verdadero',\n ),\n frente_libre: worldDoc('`verdadero` si no hay pared enfrente del robot.', 'frente_libre()', 'verdadero', true),\n izquierda_libre: worldDoc(\n '`verdadero` si no hay pared a la izquierda del robot.',\n 'izquierda_libre()',\n 'falso',\n true,\n ),\n derecha_libre: worldDoc('`verdadero` si no hay pared a la derecha del robot.', 'derecha_libre()', 'falso', true),\n hay_zumbador: worldDoc(\n '`verdadero` si hay al menos un zumbador en la casilla del robot.',\n 'hay_zumbador()',\n 'verdadero',\n true,\n ),\n tengo_zumbadores: worldDoc(\n '`verdadero` si hay al menos un zumbador en la mochila.',\n 'tengo_zumbadores()',\n 'verdadero',\n true,\n ),\n mirando_al_norte: worldDoc('`verdadero` si el robot mira al norte.', 'mirando_al_norte()', 'verdadero', true),\n mirando_al_este: worldDoc('`verdadero` si el robot mira al este.', 'mirando_al_este()', 'falso', true),\n mirando_al_sur: worldDoc('`verdadero` si el robot mira al sur.', 'mirando_al_sur()', 'falso', true),\n mirando_al_oeste: worldDoc('`verdadero` si el robot mira al oeste.', 'mirando_al_oeste()', 'falso', true),\n};\n\n// ── objetivos de un reto ─────────────────────────────────────────────────────\n\n/**\n * Lo que tiene que cumplir el mundo al terminar. Lo que no se indica, no se revisa: así un reto puede pedir\n * solo «termina en (5, 1)» o solo «recoge todos los zumbadores».\n */\nexport interface WorldGoal {\n robot?: Partial<Robot & { on: boolean }>;\n /** Zumbadores esperados en esas casillas (`0` para «vacía»). */\n beepers?: BeeperPile[];\n /** Con `true`, las casillas que no están en `beepers` tienen que quedar vacías. */\n onlyListedBeepers?: boolean;\n}\n\nexport interface GoalDifference {\n /** Qué se revisó, como `robot.x` o `beepers(3, 1)`. */\n field: string;\n expected: unknown;\n actual: unknown;\n message: string;\n}\n\n/** Compara el mundo final con un objetivo. Es una función pura. */\nexport const checkGoal = (state: WorldState, goal: WorldGoal): { ok: boolean; differences: GoalDifference[] } => {\n const differences: GoalDifference[] = [];\n const robotLabels: Record<keyof WorldState['robot'], string> = {\n x: 'la columna (x)',\n y: 'la fila (y)',\n facing: 'la orientación',\n beepers: 'los zumbadores en la mochila',\n on: 'si está encendido',\n };\n for (const [field, expected] of Object.entries(goal.robot ?? {}) as Array<[keyof WorldState['robot'], unknown]>) {\n if (expected === undefined) continue;\n const actual = state.robot[field];\n if (actual !== expected) {\n differences.push({\n field: `robot.${field}`,\n expected,\n actual,\n message:\n field === 'on'\n ? expected\n ? 'El robot tenía que quedar encendido.'\n : 'El robot tenía que terminar apagado: falta `apagar()`.'\n : `En ${robotLabels[field]} se esperaba ${JSON.stringify(expected)}, pero quedó ${JSON.stringify(actual)}.`,\n });\n }\n }\n\n const actualPiles = new Map(state.beepers.map(pile => [`${pile.x},${pile.y}`, pile.count]));\n const listed = new Set<string>();\n for (const pile of goal.beepers ?? []) {\n const key = `${pile.x},${pile.y}`;\n listed.add(key);\n const actual = actualPiles.get(key) ?? 0;\n if (actual !== pile.count) {\n differences.push({\n field: `beepers(${pile.x}, ${pile.y})`,\n expected: pile.count,\n actual,\n message: `En la casilla (${pile.x}, ${pile.y}) se esperaban ${pile.count} zumbadores, pero hay ${actual}.`,\n });\n }\n }\n if (goal.onlyListedBeepers) {\n for (const [key, count] of actualPiles) {\n if (listed.has(key)) continue;\n const [x, y] = key.split(',');\n differences.push({\n field: `beepers(${x}, ${y})`,\n expected: 0,\n actual: count,\n message: `La casilla (${x}, ${y}) tenía que quedar vacía, pero tiene ${count} zumbadores.`,\n });\n }\n }\n return { ok: differences.length === 0, differences };\n};\n",
|
|
19
|
-
"import type { ErrorKind } from './errors';\n\n/**\n * Todos los códigos de error, con una explicación larga para la página de «errores comunes» del sitio. Una\n * prueba revisa que cada código que se usa en `src/` esté aquí, y que aquí no sobre ninguno.\n */\nexport const ERROR_CODES: Readonly<Record<string, { kind: ErrorKind; explanation: string }>> = {\n // léxico\n CARÁCTER_DESCONOCIDO: {\n kind: 'léxico',\n explanation:\n 'El código tiene un carácter que Codexivo no usa, como `&`, `|` o `@`. Suele pasar al copiar código de otro lenguaje o de un documento: las comillas tipográficas (“ ”) no son comillas de código. Para «y» y «o» se escriben las palabras `y` y `o`.',\n },\n COMENTARIO_SIN_CERRAR: {\n kind: 'léxico',\n explanation:\n 'Un comentario `/*` sigue hasta encontrar `*/`. Si falta el cierre, todo lo que viene después queda dentro del comentario y no se ejecuta.',\n },\n ESCAPE_DESCONOCIDO: {\n kind: 'léxico',\n explanation:\n 'Dentro de un texto, `\\\\` empieza una secuencia de escape. Las válidas son `\\\\n` (salto de línea), `\\\\t` (tabulador), `\\\\\\\\`, `\\\\\"` y `\\\\\\'`. Para escribir una diagonal invertida se escribe dos veces.',\n },\n NOMBRE_EMPIEZA_CON_NÚMERO: {\n kind: 'léxico',\n explanation:\n 'Los nombres pueden llevar dígitos, pero no al principio: `x2` es un nombre y `2x` no. Si querías multiplicar, escribe el operador: `2 * x`.',\n },\n SEPARADOR_INVÁLIDO: {\n kind: 'léxico',\n explanation:\n 'En los números, `_` solo sirve para separar grupos de dígitos y que se lean mejor: `1_000_000`. Tiene que ir entre dos dígitos; `1__0` o `1_` no son números.',\n },\n TEXTO_SIN_CERRAR: {\n kind: 'léxico',\n explanation:\n 'Un texto empieza y termina con la misma comilla, en la misma línea. Si falta la comilla final, Codexivo no sabe dónde termina. Para un salto de línea dentro del texto usa `\\\\n`.',\n },\n\n // sintaxis\n ANIDAMIENTO_EXCESIVO: {\n kind: 'sintaxis',\n explanation:\n 'La expresión tiene demasiados niveles de paréntesis o de operaciones anidadas. Guarda partes en variables intermedias: además de evitar el error, el programa se lee mejor.',\n },\n ASIGNACIÓN_INVÁLIDA: {\n kind: 'sintaxis',\n explanation:\n 'A la izquierda de `=` (o de `+=`, `++`…) tiene que ir algo que pueda guardar un valor: una variable (`x = 1`), un elemento (`lista[0] = 1`) o un campo (`persona.edad = 16`). `5 = x` o `f(x) = 1` no tienen dónde guardarlo.',\n },\n BLOQUE_SIN_CERRAR: {\n kind: 'sintaxis',\n explanation:\n 'Cada `{` necesita su `}`. El error señala la llave que abrió el bloque; revisa que cada `si`, `mientras` o procedimiento cierre su bloque antes de que empiece lo que sigue.',\n },\n CAMPO_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Después de `.` va el nombre de un campo de un diccionario: `persona.edad`. Solo funciona con claves que son nombres válidos y que no son palabras reservadas; para las demás se escribe `d[\"clave\"]`.',\n },\n CLAVE_REPETIDA: {\n kind: 'sintaxis',\n explanation:\n 'Un diccionario escrito entre llaves tiene la misma clave dos veces. Solo se quedaría el último valor, así que casi siempre es un error de copiar y pegar.',\n },\n CLAVE_SIN_COMILLAS: {\n kind: 'sintaxis',\n explanation:\n 'Las claves de un diccionario son textos o números, y los textos van entre comillas: `{ \"nombre\": \"Ana\" }`. Si querías usar el valor de una variable como clave, escríbela entre paréntesis: `{ (clave): 1 }`.',\n },\n COMPARACIÓN_ENCADENADA: {\n kind: 'sintaxis',\n explanation:\n '`1 < x < 5` parece natural, pero esconde dos comparaciones. En Codexivo se escriben las dos y se unen con `y`: `1 < x y x < 5`.',\n },\n CONTINUAR_FUERA_DE_BUCLE: {\n kind: 'sintaxis',\n explanation:\n '`continuar` salta a la siguiente vuelta del bucle más cercano, así que solo tiene sentido dentro de uno. Dentro de un procedimiento no afecta al bucle desde donde se llamó.',\n },\n DICCIONARIO_COMO_SENTENCIA: {\n kind: 'sintaxis',\n explanation:\n 'Al inicio de una sentencia, `{` abre un bloque. Un diccionario tiene que estar en una expresión: guárdalo en una variable (`variable d = { \"a\": 1 }`) o pásalo a un procedimiento.',\n },\n DOMINIO_SOLO_DECLARACIONES: {\n kind: 'sintaxis',\n explanation:\n 'Un `dominio` es un espacio de nombres: solo agrupa declaraciones (`variable`, `constante`, `procedimiento` y otros `dominio`). El código que hace algo, como un `si` o un `imprimir`, va dentro de un procedimiento del dominio o fuera de él.',\n },\n EN_SIN_PARA_CADA: {\n kind: 'sintaxis',\n explanation: '`en` es parte de `para_cada elemento en lista { … }` y no se puede usar sola ni como nombre.',\n },\n EXPRESIÓN_ESPERADA: {\n kind: 'sintaxis',\n explanation:\n 'En ese lugar iba un valor (un número, un texto, una variable, una llamada…) y apareció otra cosa. Suele faltar un operando, como en `x = * 2`, o se usó una palabra reservada como si fuera un nombre.',\n },\n EXPRESIÓN_INCOMPLETA: {\n kind: 'sintaxis',\n explanation:\n 'El programa terminó a mitad de una expresión, como en `x = 1 +`. Revisa que no falte el último valor.',\n },\n FIN_DE_SENTENCIA: {\n kind: 'sintaxis',\n explanation:\n 'Dos sentencias en la misma línea tienen que separarse con `;`. Si querías combinar dos valores, falta un operador entre ellos: `1 2` no significa nada, pero `1 + 2` sí.',\n },\n HASTA_QUE_SIN_HACER: {\n kind: 'sintaxis',\n explanation:\n '`hasta_que (condición)` cierra un bucle `hacer { … }` y tiene que ir justo después de su `}`. Para repetir mientras algo sea verdadero, usa `mientras`.',\n },\n INCREMENTO_EN_EXPRESIÓN: {\n kind: 'sintaxis',\n explanation:\n '`i++` e `i--` son sentencias: cambian la variable y nada más. No se pueden usar dentro de una expresión (`x = i++`) ni antes del nombre (`++i`). Escribe `i++` en su propia línea y después usa `i`.',\n },\n LLAVE_SOBRANTE: {\n kind: 'sintaxis',\n explanation: 'Hay una `}` que no cierra ningún bloque. Suele ser una llave de más, o una que falta más arriba.',\n },\n NOMBRE_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Después de `variable`, `constante`, `procedimiento` o `para_cada` va un nombre: letras, dígitos y `_`, sin empezar con dígito.',\n },\n NOMBRE_REPETIDO: {\n kind: 'sintaxis',\n explanation:\n 'Un procedimiento con nombre existe desde el inicio de su bloque, para poder llamarlo antes de la línea donde se escribe. Por eso su nombre no se puede repetir en el mismo bloque, ni con otro procedimiento ni con una variable.',\n },\n PALABRA_DESCONOCIDA: {\n kind: 'sintaxis',\n explanation:\n 'Se parece a una palabra de Codexivo, pero no lo es. Las palabras compuestas llevan guion bajo: `si_no`, `pero_si`, `hasta_que`.',\n },\n PALABRA_RESERVADA: {\n kind: 'sintaxis',\n explanation:\n 'Las palabras reservadas (`si`, `mientras`, `y`, `veces`, `mod`…) tienen un significado fijo y no se pueden usar como nombres. Elige otro nombre, por ejemplo agregando una palabra: `valor_inicial`.',\n },\n PARÁMETRO_REPETIDO: {\n kind: 'sintaxis',\n explanation:\n 'Dos parámetros de un procedimiento (o las dos variables de un `para_cada`) tienen el mismo nombre, así que no habría forma de distinguirlos.',\n },\n PROCEDIMIENTO_CON_NOMBRE: {\n kind: 'sintaxis',\n explanation:\n '`procedimiento nombre(…) { … }` es una sentencia y no puede ir dentro de una expresión. Como valor, el procedimiento se escribe sin nombre: `variable doble = procedimiento(x) { regresa x * 2 }`.',\n },\n RAMA_SIN_SI: {\n kind: 'sintaxis',\n explanation:\n '`pero_si` y `si_no` continúan un `si` y van justo después de la `}` de su bloque. Una sentencia en medio rompe la cadena.',\n },\n REPETIR_SIN_CANTIDAD: {\n kind: 'sintaxis',\n explanation: 'Falta cuántas veces se repite el bloque. La forma completa es `repetir 4 veces { … }`.',\n },\n ROMPER_FUERA_DE_BUCLE: {\n kind: 'sintaxis',\n explanation:\n '`romper` sale del bucle más cercano, así que solo tiene sentido dentro de uno. Para salir de un procedimiento se usa `regresa`.',\n },\n SENTENCIA_EN_EXPRESIÓN: {\n kind: 'sintaxis',\n explanation:\n 'Palabras como `si`, `mientras` o `variable` empiezan una sentencia y no dan un valor, así que no pueden ir donde se espera uno, como a la derecha de `=`.',\n },\n SI_NO_SI: {\n kind: 'sintaxis',\n explanation:\n 'Después de `si_no` va directamente un bloque. Para probar otra condición se usa `pero_si (condición) { … }`.',\n },\n TOKEN_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Falta un símbolo o una palabra que la sentencia necesita, como el `(` de una condición o el `veces` de `repetir`. El mensaje dice qué se esperaba y qué se encontró.',\n },\n ÍNDICE_VACÍO: {\n kind: 'sintaxis',\n explanation: 'Entre los corchetes va la posición o la clave: `lista[0]`, `d[\"nombre\"]`.',\n },\n\n // ejecución\n CANTIDAD_DE_ARGUMENTOS: {\n kind: 'ejecución',\n explanation:\n 'Un procedimiento se llama con exactamente tantos valores como parámetros tiene. Si faltan o sobran, es un error: Codexivo no rellena los que faltan.',\n },\n CHOQUE_CON_PARED: {\n kind: 'ejecución',\n explanation:\n 'El robot intentó avanzar hacia una pared o fuera del mundo. Antes de `avanzar()`, pregunta con `frente_libre()`.',\n },\n CLAVE_INEXISTENTE: {\n kind: 'ejecución',\n explanation:\n 'Se leyó una clave que el diccionario no tiene. Pregunta antes con `tiene(d, clave)`, o revisa que la clave esté bien escrita: `\"Edad\"` y `\"edad\"` son distintas, igual que `1` y `\"1\"`.',\n },\n CLAVE_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n 'Las claves de un diccionario son textos o números. Una lista, un lógico o `nulo` no pueden ser clave.',\n },\n COLA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'Se intentó sacar o consultar el frente de una cola que no tiene nada. Revisa antes con `longitud(cola) > 0`.',\n },\n COMPARACIÓN_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n '`<`, `>`, `<=` y `>=` comparan dos números o dos textos. Comparar un número con un texto no tiene un orden claro; convierte uno de los dos con `número(…)` o `texto(…)`.',\n },\n CONDICIÓN_NO_LÓGICA: {\n kind: 'ejecución',\n explanation:\n 'Las condiciones de `si`, `mientras`, `hasta_que` y `para` tienen que ser `verdadero` o `falso`. En otros lenguajes `si (x)` funciona con números; en Codexivo se dice lo que se quiere preguntar: `si (x es_distinto_de 0)`.',\n },\n CONSTANTE_REASIGNADA: {\n kind: 'ejecución',\n explanation:\n 'Una `constante` no cambia de valor. Si necesitas cambiarlo, declárala con `variable` en lugar de `constante`.',\n },\n DICCIONARIO_MODIFICADO_AL_RECORRER: {\n kind: 'ejecución',\n explanation:\n 'Se agregaron o quitaron claves de un diccionario mientras `para_cada` lo recorría. Recorre `claves(d)`, que es una lista nueva, o junta los cambios y aplícalos al terminar.',\n },\n DIVISIÓN_ENTRE_CERO: {\n kind: 'ejecución',\n explanation:\n 'Dividir entre cero (con `/`, `div`, `mod` o `%`) no tiene resultado. Revisa el divisor antes de dividir.',\n },\n LISTA_MODIFICADA_AL_RECORRER: {\n kind: 'ejecución',\n explanation:\n 'La lista cambió de tamaño mientras `para_cada` la recorría, así que no queda claro qué elemento sigue. Cambiar elementos está bien; para agregar o quitar, recorre una copia o junta los cambios en otra lista.',\n },\n LISTA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'El procedimiento necesita al menos un elemento y la lista está vacía. Revisa antes con `longitud(lista) > 0`.',\n },\n MIEMBRO_DE_SOLO_LECTURA: {\n kind: 'ejecución',\n explanation:\n 'Desde fuera de un dominio solo se pueden cambiar sus miembros declarados con `variable`. Sus constantes, sus procedimientos y los dominios que contiene quedan fijos, para que `calculadora.suma` siempre sea el mismo procedimiento.',\n },\n MIEMBRO_INEXISTENTE: {\n kind: 'ejecución',\n explanation:\n 'El dominio no tiene un miembro con ese nombre. Puede estar mal escrito; los miembros se declaran dentro de las llaves del dominio y desde fuera no se pueden agregar.',\n },\n MOCHILA_VACÍA: {\n kind: 'ejecución',\n explanation: 'El robot intentó dejar un zumbador sin tener ninguno. Pregunta antes con `tengo_zumbadores()`.',\n },\n NOMBRE_DESCONOCIDO: {\n kind: 'ejecución',\n explanation:\n 'No hay ninguna variable ni procedimiento con ese nombre a la vista. Puede estar mal escrito, declararse más abajo, o haberse declarado dentro de un bloque que ya terminó.',\n },\n NOMBRE_RESERVADO_POR_BIBLIOTECA: {\n kind: 'ejecución',\n explanation:\n 'Ese nombre es de la biblioteca de Codexivo y no se le puede asignar un valor. Si quieres una variable propia con ese nombre, declárala con `variable`; mientras exista, oculta al de la biblioteca.',\n },\n NO_ES_NÚMERO: {\n kind: 'ejecución',\n explanation:\n 'Se esperaba un número y el texto no lo es, como `\"doce\"` o `\"3,5\"`. Los decimales se escriben con punto: `\"3.5\"`.',\n },\n NO_ES_PROCEDIMIENTO: {\n kind: 'ejecución',\n explanation:\n 'Se intentó llamar con `( )` a algo que no es un procedimiento, como un número o una lista. Revisa que no estés usando una variable con el mismo nombre que el procedimiento.',\n },\n OPERANDO_NO_LÓGICO: {\n kind: 'ejecución',\n explanation:\n '`y`, `o` y `no` unen valores `verdadero` o `falso`. Para preguntar algo sobre un número o un texto, compáralo primero: `x > 0 y nombre != \"\"`.',\n },\n PARA_LÍMITE_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'En `para i desde a hasta b con_paso p`, el inicio, el final y el paso tienen que ser números. Si vienen de `leer()`, conviértelos con `número(…)` o usa `leer_número()`.',\n },\n PARA_PASO_CERO: {\n kind: 'ejecución',\n explanation:\n 'Con `con_paso 0`, la variable nunca cambiaría y el `para` no llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n },\n PARA_SENTIDO_CONTRARIO: {\n kind: 'ejecución',\n explanation:\n 'El paso va en el sentido contrario al que hay que recorrer: por ejemplo, `para i desde 10 hasta 1` sin paso cuenta hacia arriba y nunca llegaría al 1. Codexivo no lo invierte solo ni hace cero vueltas en silencio: para contar hacia atrás escribe `con_paso -1`.',\n },\n PARA_CADA_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n '`para_cada` recorre listas, textos y diccionarios. Para contar se recorre un rango (`para_cada i en rango(1, 10)`), y la forma con dos variables (`para_cada clave, valor en d`) es solo para diccionarios.',\n },\n PILA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'Se intentó sacar o consultar el tope de una pila que no tiene nada. Revisa antes con `longitud(pila) > 0`.',\n },\n POTENCIA_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n 'Un número negativo elevado a un exponente con decimales, como `(-8) ^ 0.5`, no tiene un resultado real. Con exponentes enteros sí funciona.',\n },\n RANGO_DEMASIADO_GRANDE: {\n kind: 'ejecución',\n explanation:\n 'El `rango` tendría millones de números, lo que casi siempre es un error en el inicio, el final o el paso. Revísalos.',\n },\n RANGO_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'En `subtexto` y `rebanar`, el inicio no puede estar después del fin. El fin no se incluye: `subtexto(\"hola\", 1, 3)` es `\"ol\"`.',\n },\n RANGO_PASO_CERO: {\n kind: 'ejecución',\n explanation:\n 'Con paso 0, `rango` nunca llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n },\n RAÍZ_DE_NEGATIVO: {\n kind: 'ejecución',\n explanation: 'La raíz cuadrada solo existe para números de 0 en adelante.',\n },\n REPETICIONES_INVÁLIDAS: {\n kind: 'ejecución',\n explanation:\n '`repetir n veces` necesita que `n` sea un número entero, 0 o más. Con un texto, conviértelo con `número(…)`; con decimales, redondéalo.',\n },\n ROBOT_APAGADO: {\n kind: 'ejecución',\n explanation: 'Después de `apagar()` el robot ya no hace ninguna acción. `apagar()` va al final del programa.',\n },\n SEPARADOR_VACÍO: {\n kind: 'ejecución',\n explanation:\n '`dividir` y `reemplazar` necesitan un texto que buscar que no esté vacío. Para separar letra por letra, usa `caracteres(t)`.',\n },\n SIN_ENTRADA: {\n kind: 'ejecución',\n explanation:\n '`leer_número()` no encontró más datos de entrada. Revisa cuántos datos espera el programa y cuántos se le dieron.',\n },\n SIN_ZUMBADORES: {\n kind: 'ejecución',\n explanation: 'El robot intentó recoger un zumbador donde no hay. Pregunta antes con `hay_zumbador()`.',\n },\n TEXTO_INMUTABLE: {\n kind: 'ejecución',\n explanation:\n 'Los textos no se cambian letra por letra: `t[0] = \"H\"` es un error. Se construye un texto nuevo, por ejemplo uniendo partes con `+` o con `reemplazar`.',\n },\n TIPOS_MEZCLADOS: {\n kind: 'ejecución',\n explanation:\n '`+` suma dos números o une dos textos, pero no mezcla: `\"Total: \" + 5` es un error. Convierte el número con `texto(5)`, o imprime los dos por separado: `imprimir(\"Total:\", 5)`.',\n },\n TIPO_DE_ARGUMENTO: {\n kind: 'ejecución',\n explanation:\n 'Un procedimiento de la biblioteca recibió un valor de un tipo que no acepta, como un texto donde esperaba un número. El mensaje dice qué esperaba y qué recibió.',\n },\n TIPO_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'El operador no funciona con esos tipos, como `-` entre dos textos o `no` con un número. Revisa qué valor tiene cada lado.',\n },\n VARIABLE_DE_PARA: {\n kind: 'ejecución',\n explanation:\n 'La variable de `para i desde … hasta …` avanza sola en cada vuelta, así que no se puede cambiar dentro del bucle. Si necesitas otro valor, guárdalo en una variable nueva; si necesitas controlar el avance a mano, usa `mientras`.',\n },\n VARIABLE_NO_DECLARADA: {\n kind: 'ejecución',\n explanation:\n 'Se le asignó un valor a una variable que no existe. La primera vez se declara con `variable x = …`; después se cambia con `x = …`.',\n },\n VARIABLE_REPETIDA: {\n kind: 'ejecución',\n explanation:\n 'La variable ya existe en este bloque. Para cambiar su valor se escribe `x = …`, sin `variable`. Un bloque interno sí puede declarar otra con el mismo nombre.',\n },\n ÍNDICE_FUERA_DE_RANGO: {\n kind: 'ejecución',\n explanation:\n 'Las posiciones van de 0 a `longitud - 1` (o de -1 a `-longitud` desde el final). Un error clásico es usar `longitud(lista)` como índice: el último es `longitud(lista) - 1`.',\n },\n ÍNDICE_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'La posición de una lista o texto tiene que ser un número entero. Las claves de texto son para diccionarios.',\n },\n ÍNDICE_NO_SOPORTADO: {\n kind: 'ejecución',\n explanation:\n '`[ ]` funciona con listas, textos y diccionarios, y `.campo` solo con diccionarios. Revisa qué valor tiene la variable.',\n },\n\n // límite\n DEMASIADAS_LLAMADAS: {\n kind: 'límite',\n explanation:\n 'Hay demasiadas llamadas anidadas, casi siempre por una recursión sin caso base: el procedimiento se llama a sí mismo sin una condición que lo detenga.',\n },\n DEMASIADAS_OPERACIONES: {\n kind: 'límite',\n explanation:\n 'El programa hizo más operaciones de las permitidas. Casi siempre es un bucle cuya condición nunca cambia; revisa que algo dentro del bucle lo acerque al final.',\n },\n DEMASIADA_SALIDA: {\n kind: 'límite',\n explanation:\n 'El programa imprimió demasiado texto, casi siempre por un `imprimir` dentro de un bucle que no termina.',\n },\n};\n",
|
|
20
|
-
"import { ERROR_CODES } from './error-codes';\nimport type { ErrorKind } from './errors';\nimport { constantDocs, constants, natives, withoutAccents } from './runtime/builtins';\nimport { libraryDocs } from './runtime/prelude';\nimport type { ProcedureCategory, ProcedureDoc, ProcedureLevel } from './runtime/values';\nimport { KEYWORDS, TokenType } from './syntax/token';\nimport { EXAMPLE_WORLD, worldDocs } from './world';\nimport type { WorldDefinition } from './world';\n\n/**\n * El lenguaje y su biblioteca como datos, para que el resaltado, el autocompletado, la documentación y los\n * avisos del editor del sitio salgan de una sola fuente. Todo es serializable: no hay funciones.\n */\n\nexport type KeywordGroup = 'declaración' | 'control' | 'lógicas' | 'literales' | 'operadores';\n\nexport interface OperatorEntry {\n symbol?: string;\n /** Forma en palabras (`es_igual_a`, `mod`), si la tiene. */\n word?: string;\n /** Nivel de precedencia de la §4.1: 1 es el que agrupa al final, 9 el primero. */\n precedence: number;\n associativity: 'izquierda' | 'derecha' | 'prefijo' | 'sin encadenar';\n description: string;\n}\n\nexport interface ProcedureEntry extends ProcedureDoc {\n /** Nombre canónico, con acento si lo lleva. */\n name: string;\n /** Otras formas aceptadas (el nombre sin acento). */\n aliases: string[];\n}\n\nexport interface ConstantEntry {\n name: string;\n value: number;\n level: ProcedureLevel;\n description: string;\n}\n\nexport interface ErrorEntry {\n code: string;\n kind: ErrorKind;\n explanation: string;\n}\n\nexport interface Catalog {\n version: 1;\n keywords: Array<{ group: KeywordGroup; words: string[] }>;\n operators: OperatorEntry[];\n /** Procedimientos de la biblioteca, incluidos los del modo mundo (categoría `mundo`). */\n library: ProcedureEntry[];\n constants: ConstantEntry[];\n errors: ErrorEntry[];\n categories: ProcedureCategory[];\n /** Mundo con el que se ejecutan los ejemplos de la categoría `mundo`. */\n exampleWorld: WorldDefinition;\n}\n\nconst KEYWORD_GROUPS: Readonly<Record<string, KeywordGroup>> = {\n [TokenType.LET]: 'declaración',\n [TokenType.CONST]: 'declaración',\n [TokenType.DOMAIN]: 'declaración',\n [TokenType.FUNCTION]: 'declaración',\n [TokenType.RETURN]: 'declaración',\n [TokenType.IF]: 'control',\n [TokenType.ELSEIF]: 'control',\n [TokenType.ELSE]: 'control',\n [TokenType.WHILE]: 'control',\n [TokenType.DO]: 'control',\n [TokenType.UNTIL]: 'control',\n [TokenType.FOR]: 'control',\n [TokenType.FOR_EACH]: 'control',\n [TokenType.FROM]: 'control',\n [TokenType.TO]: 'control',\n [TokenType.STEP]: 'control',\n [TokenType.IN]: 'control',\n [TokenType.REPEAT]: 'control',\n [TokenType.TIMES]: 'control',\n [TokenType.BREAK]: 'control',\n [TokenType.CONTINUE]: 'control',\n [TokenType.AND]: 'lógicas',\n [TokenType.OR]: 'lógicas',\n [TokenType.NOT]: 'lógicas',\n [TokenType.TRUE]: 'literales',\n [TokenType.FALSE]: 'literales',\n [TokenType.NULL]: 'literales',\n [TokenType.MOD]: 'operadores',\n [TokenType.DIV]: 'operadores',\n [TokenType.EQ]: 'operadores',\n [TokenType.NEQ]: 'operadores',\n [TokenType.LT]: 'operadores',\n [TokenType.GT]: 'operadores',\n [TokenType.LTE]: 'operadores',\n [TokenType.GTE]: 'operadores',\n};\n\nconst GROUP_ORDER: KeywordGroup[] = ['declaración', 'control', 'lógicas', 'literales', 'operadores'];\n\n/** Grupo de cada palabra reservada; una palabra sin grupo es un error del catálogo (lo revisa una prueba). */\nexport const keywordGroup = (word: string): KeywordGroup | undefined => KEYWORD_GROUPS[KEYWORDS[word] ?? ''];\n\nconst keywords = GROUP_ORDER.map(group => ({\n group,\n words: Object.keys(KEYWORDS).filter(word => keywordGroup(word) === group),\n}));\n\nconst operators: OperatorEntry[] = [\n {\n word: 'o',\n precedence: 1,\n associativity: 'izquierda',\n description: 'Verdadero si alguno de los dos lo es. Si el izquierdo es verdadero, no evalúa el derecho.',\n },\n {\n word: 'y',\n precedence: 2,\n associativity: 'izquierda',\n description: 'Verdadero si los dos lo son. Si el izquierdo es falso, no evalúa el derecho.',\n },\n {\n symbol: '!',\n word: 'no',\n precedence: 3,\n associativity: 'prefijo',\n description: 'Cambia verdadero por falso y al revés.',\n },\n {\n symbol: '==',\n word: 'es_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Igualdad por valor, también de listas y diccionarios.',\n },\n {\n symbol: '!=',\n word: 'es_distinto_de',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Lo contrario de `==`.',\n },\n {\n symbol: '<',\n word: 'es_menor_que',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '>',\n word: 'es_mayor_que',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '<=',\n word: 'es_menor_o_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '>=',\n word: 'es_mayor_o_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '+',\n precedence: 5,\n associativity: 'izquierda',\n description: 'Suma dos números o une dos textos; no los mezcla.',\n },\n { symbol: '-', precedence: 5, associativity: 'izquierda', description: 'Resta.' },\n { symbol: '*', precedence: 6, associativity: 'izquierda', description: 'Multiplica.' },\n { symbol: '/', precedence: 6, associativity: 'izquierda', description: 'División real: `7 / 2` es `3.5`.' },\n {\n word: 'div',\n precedence: 6,\n associativity: 'izquierda',\n description: 'División entera hacia abajo: `-7 div 2` es `-4`.',\n },\n {\n symbol: '%',\n word: 'mod',\n precedence: 6,\n associativity: 'izquierda',\n description: 'Residuo consistente con `div`: `-7 mod 3` es `2`.',\n },\n { symbol: '-', precedence: 7, associativity: 'prefijo', description: 'Cambia el signo.' },\n {\n symbol: '^',\n precedence: 8,\n associativity: 'derecha',\n description: 'Potencia: `2 ^ 3 ^ 2` es `2 ^ 9`, y `-2 ^ 2` es `-4`.',\n },\n { symbol: '( )', precedence: 9, associativity: 'izquierda', description: 'Llama a un procedimiento: `f(x)`.' },\n {\n symbol: '[ ]',\n precedence: 9,\n associativity: 'izquierda',\n description: 'Elemento de una lista o texto, o clave de un diccionario: `l[0]`, `d[\"a\"]`.',\n },\n {\n symbol: '.',\n precedence: 9,\n associativity: 'izquierda',\n description: 'Campo de un diccionario: `persona.edad` es `persona[\"edad\"]`.',\n },\n];\n\nconst entry = (name: string, doc: ProcedureDoc): ProcedureEntry => {\n const alias = withoutAccents(name);\n return { name, aliases: alias === name ? [] : [alias], ...doc };\n};\n\nconst library: ProcedureEntry[] = [\n ...Object.values(natives)\n .filter((native, index, all) => all.indexOf(native) === index)\n .map(native => entry(native.name, native.doc!)),\n ...Object.entries(libraryDocs).map(([name, doc]) => entry(name, doc)),\n ...Object.entries(worldDocs).map(([name, doc]) => entry(name, doc)),\n];\n\nconst CATEGORIES: ProcedureCategory[] = [\n 'entrada y salida',\n 'tipos',\n 'matemáticas',\n 'texto',\n 'listas',\n 'diccionarios',\n 'procedimientos',\n 'estructuras',\n 'mundo',\n];\n\nexport const catalog: Catalog = {\n version: 1,\n keywords,\n operators,\n library: library.sort(\n (a, b) => CATEGORIES.indexOf(a.category) - CATEGORIES.indexOf(b.category) || a.name.localeCompare(b.name, 'es'),\n ),\n constants: Object.entries(constantDocs).map(([name, doc]) => ({\n name,\n value: constants[name] as number,\n ...doc,\n })),\n errors: Object.entries(ERROR_CODES)\n .map(([code, info]) => ({ code, ...info }))\n .sort((a, b) => a.code.localeCompare(b.code, 'es')),\n categories: CATEGORIES,\n exampleWorld: EXAMPLE_WORLD,\n};\n",
|
|
19
|
+
"import type { ErrorKind } from './errors';\n\n/**\n * Todos los códigos de error, con una explicación larga para la página de «errores comunes» del sitio. Una\n * prueba revisa que cada código que se usa en `src/` esté aquí, y que aquí no sobre ninguno.\n */\nexport const ERROR_CODES: Readonly<Record<string, { kind: ErrorKind; explanation: string }>> = {\n // léxico\n CARÁCTER_DESCONOCIDO: {\n kind: 'léxico',\n explanation:\n 'El código tiene un carácter que Codexivo no usa, como `&`, `|` o `@`. Suele pasar al copiar código de otro lenguaje o de un documento: las comillas tipográficas (“ ”) no son comillas de código. Para «y» y «o» se escriben las palabras `y` y `o`.',\n },\n COMENTARIO_SIN_CERRAR: {\n kind: 'léxico',\n explanation:\n 'Un comentario `/*` sigue hasta encontrar `*/`. Si falta el cierre, todo lo que viene después queda dentro del comentario y no se ejecuta.',\n },\n ESCAPE_DESCONOCIDO: {\n kind: 'léxico',\n explanation:\n 'Dentro de un texto, `\\\\` empieza una secuencia de escape. Las válidas son `\\\\n` (salto de línea), `\\\\t` (tabulador), `\\\\\\\\`, `\\\\\"` y `\\\\\\'`. Para escribir una diagonal invertida se escribe dos veces.',\n },\n NOMBRE_EMPIEZA_CON_NÚMERO: {\n kind: 'léxico',\n explanation:\n 'Los nombres pueden llevar dígitos, pero no al principio: `x2` es un nombre y `2x` no. Si querías multiplicar, escribe el operador: `2 * x`.',\n },\n SEPARADOR_INVÁLIDO: {\n kind: 'léxico',\n explanation:\n 'En los números, `_` solo sirve para separar grupos de dígitos y que se lean mejor: `1_000_000`. Tiene que ir entre dos dígitos; `1__0` o `1_` no son números.',\n },\n TEXTO_SIN_CERRAR: {\n kind: 'léxico',\n explanation:\n 'Un texto empieza y termina con la misma comilla, en la misma línea. Si falta la comilla final, Codexivo no sabe dónde termina. Para un salto de línea dentro del texto usa `\\\\n`.',\n },\n\n // sintaxis\n ANIDAMIENTO_EXCESIVO: {\n kind: 'sintaxis',\n explanation:\n 'La expresión tiene demasiados niveles de paréntesis o de operaciones anidadas. Guarda partes en variables intermedias: además de evitar el error, el programa se lee mejor.',\n },\n ASIGNACIÓN_INVÁLIDA: {\n kind: 'sintaxis',\n explanation:\n 'A la izquierda de `=` (o de `+=`, `++`…) tiene que ir algo que pueda guardar un valor: una variable (`x = 1`), un elemento (`lista[0] = 1`) o un campo (`persona.edad = 16`). `5 = x` o `f(x) = 1` no tienen dónde guardarlo.',\n },\n BLOQUE_SIN_CERRAR: {\n kind: 'sintaxis',\n explanation:\n 'Cada `{` necesita su `}`. El error señala la llave que abrió el bloque; revisa que cada `si`, `mientras` o procedimiento cierre su bloque antes de que empiece lo que sigue.',\n },\n CAMPO_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Después de `.` va el nombre de un campo de un diccionario: `persona.edad`. Solo funciona con claves que son nombres válidos y que no son palabras reservadas; para las demás se escribe `d[\"clave\"]`.',\n },\n CLAVE_REPETIDA: {\n kind: 'sintaxis',\n explanation:\n 'Un diccionario escrito entre llaves tiene la misma clave dos veces. Solo se quedaría el último valor, así que casi siempre es un error de copiar y pegar.',\n },\n CLAVE_SIN_COMILLAS: {\n kind: 'sintaxis',\n explanation:\n 'Las claves de un diccionario son textos o números, y los textos van entre comillas: `{ \"nombre\": \"Ana\" }`. Si querías usar el valor de una variable como clave, escríbela entre paréntesis: `{ (clave): 1 }`.',\n },\n COMPARACIÓN_ENCADENADA: {\n kind: 'sintaxis',\n explanation:\n '`1 < x < 5` parece natural, pero esconde dos comparaciones. En Codexivo se escriben las dos y se unen con `y`: `1 < x y x < 5`.',\n },\n CONTINUAR_FUERA_DE_BUCLE: {\n kind: 'sintaxis',\n explanation:\n '`continuar` salta a la siguiente vuelta del bucle más cercano, así que solo tiene sentido dentro de uno. Dentro de un procedimiento no afecta al bucle desde donde se llamó.',\n },\n DICCIONARIO_COMO_SENTENCIA: {\n kind: 'sintaxis',\n explanation:\n 'Al inicio de una sentencia, `{` abre un bloque. Un diccionario tiene que estar en una expresión: guárdalo en una variable (`variable d = { \"a\": 1 }`) o pásalo a un procedimiento.',\n },\n DOMINIO_SOLO_DECLARACIONES: {\n kind: 'sintaxis',\n explanation:\n 'Un `dominio` es un espacio de nombres: solo agrupa declaraciones (`variable`, `constante`, `procedimiento` y otros `dominio`). El código que hace algo, como un `si` o un `imprimir`, va dentro de un procedimiento del dominio o fuera de él.',\n },\n EN_SIN_PARA_CADA: {\n kind: 'sintaxis',\n explanation: '`en` es parte de `para_cada elemento en lista { … }` y no se puede usar sola ni como nombre.',\n },\n EXPRESIÓN_ESPERADA: {\n kind: 'sintaxis',\n explanation:\n 'En ese lugar iba un valor (un número, un texto, una variable, una llamada…) y apareció otra cosa. Suele faltar un operando, como en `x = * 2`, o se usó una palabra reservada como si fuera un nombre.',\n },\n EXPRESIÓN_INCOMPLETA: {\n kind: 'sintaxis',\n explanation:\n 'El programa terminó a mitad de una expresión, como en `x = 1 +`. Revisa que no falte el último valor.',\n },\n FIN_DE_SENTENCIA: {\n kind: 'sintaxis',\n explanation:\n 'Dos sentencias en la misma línea tienen que separarse con `;`. Si querías combinar dos valores, falta un operador entre ellos: `1 2` no significa nada, pero `1 + 2` sí.',\n },\n HASTA_QUE_SIN_HACER: {\n kind: 'sintaxis',\n explanation:\n '`hasta_que (condición)` cierra un bucle `hacer { … }` y tiene que ir justo después de su `}`. Para repetir mientras algo sea verdadero, usa `mientras`.',\n },\n INCREMENTO_EN_EXPRESIÓN: {\n kind: 'sintaxis',\n explanation:\n '`i++` e `i--` son sentencias: cambian la variable y nada más. No se pueden usar dentro de una expresión (`x = i++`) ni antes del nombre (`++i`). Escribe `i++` en su propia línea y después usa `i`.',\n },\n LLAVE_SOBRANTE: {\n kind: 'sintaxis',\n explanation: 'Hay una `}` que no cierra ningún bloque. Suele ser una llave de más, o una que falta más arriba.',\n },\n NOMBRE_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Después de `variable`, `constante`, `procedimiento` o `para_cada` va un nombre: letras, dígitos y `_`, sin empezar con dígito.',\n },\n NOMBRE_REPETIDO: {\n kind: 'sintaxis',\n explanation:\n 'Un procedimiento con nombre existe desde el inicio de su bloque, para poder llamarlo antes de la línea donde se escribe. Por eso su nombre no se puede repetir en el mismo bloque, ni con otro procedimiento ni con una variable.',\n },\n PALABRA_DESCONOCIDA: {\n kind: 'sintaxis',\n explanation:\n 'Se parece a una palabra de Codexivo, pero no lo es. Las palabras compuestas llevan guion bajo: `si_no`, `pero_si`, `hasta_que`.',\n },\n PALABRA_RESERVADA: {\n kind: 'sintaxis',\n explanation:\n 'Las palabras reservadas (`si`, `mientras`, `y`, `veces`, `mod`…) tienen un significado fijo y no se pueden usar como nombres. Elige otro nombre, por ejemplo agregando una palabra: `valor_inicial`.',\n },\n PARÁMETRO_REPETIDO: {\n kind: 'sintaxis',\n explanation:\n 'Dos parámetros de un procedimiento (o las dos variables de un `para_cada`) tienen el mismo nombre, así que no habría forma de distinguirlos.',\n },\n PROCEDIMIENTO_CON_NOMBRE: {\n kind: 'sintaxis',\n explanation:\n '`procedimiento nombre(…) { … }` es una sentencia y no puede ir dentro de una expresión. Como valor, el procedimiento se escribe sin nombre: `variable doble = procedimiento(x) { regresa x * 2 }`.',\n },\n RAMA_SIN_SI: {\n kind: 'sintaxis',\n explanation:\n '`pero_si` y `si_no` continúan un `si` y van justo después de la `}` de su bloque. Una sentencia en medio rompe la cadena.',\n },\n REPETIR_SIN_CANTIDAD: {\n kind: 'sintaxis',\n explanation: 'Falta cuántas veces se repite el bloque. La forma completa es `repetir 4 veces { … }`.',\n },\n ROMPER_FUERA_DE_BUCLE: {\n kind: 'sintaxis',\n explanation:\n '`romper` sale del bucle más cercano, así que solo tiene sentido dentro de uno. Para salir de un procedimiento se usa `regresa`.',\n },\n SENTENCIA_EN_EXPRESIÓN: {\n kind: 'sintaxis',\n explanation:\n 'Palabras como `si`, `mientras` o `variable` empiezan una sentencia y no dan un valor, así que no pueden ir donde se espera uno, como a la derecha de `=`.',\n },\n SI_NO_SI: {\n kind: 'sintaxis',\n explanation:\n 'Después de `si_no` va directamente un bloque. Para probar otra condición se usa `pero_si (condición) { … }`.',\n },\n TOKEN_ESPERADO: {\n kind: 'sintaxis',\n explanation:\n 'Falta un símbolo o una palabra que la sentencia necesita, como el `(` de una condición o el `veces` de `repetir`. El mensaje dice qué se esperaba y qué se encontró.',\n },\n ÍNDICE_VACÍO: {\n kind: 'sintaxis',\n explanation: 'Entre los corchetes va la posición o la clave: `lista[0]`, `d[\"nombre\"]`.',\n },\n\n // ejecución\n AFIRMACIÓN_FALLIDA: {\n kind: 'ejecución',\n explanation:\n 'Una llamada a `afirmar(condición, mensaje)` encontró que su condición era falsa. Afirmar es escribir lo que esperas que sea cierto en ese punto del programa; si no lo es, el programa se detiene ahí, antes de que el error llegue más lejos. Revisa los valores de las variables justo antes de esa línea.',\n },\n CANTIDAD_DE_ARGUMENTOS: {\n kind: 'ejecución',\n explanation:\n 'Un procedimiento se llama con exactamente tantos valores como parámetros tiene. Si faltan o sobran, es un error: Codexivo no rellena los que faltan.',\n },\n CHOQUE_CON_PARED: {\n kind: 'ejecución',\n explanation:\n 'El robot intentó avanzar hacia una pared o fuera del mundo. Antes de `avanzar()`, pregunta con `frente_libre()`.',\n },\n CLAVE_INEXISTENTE: {\n kind: 'ejecución',\n explanation:\n 'Se leyó una clave que el diccionario no tiene. Pregunta antes con `tiene(d, clave)`, o revisa que la clave esté bien escrita: `\"Edad\"` y `\"edad\"` son distintas, igual que `1` y `\"1\"`.',\n },\n CLAVE_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n 'Las claves de un diccionario son textos o números. Una lista, un lógico o `nulo` no pueden ser clave.',\n },\n COLA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'Se intentó sacar o consultar el frente de una cola que no tiene nada. Revisa antes con `longitud(cola) > 0`.',\n },\n COMPARACIÓN_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n '`<`, `>`, `<=` y `>=` comparan dos números o dos textos. Comparar un número con un texto no tiene un orden claro; convierte uno de los dos con `número(…)` o `texto(…)`.',\n },\n CONDICIÓN_NO_LÓGICA: {\n kind: 'ejecución',\n explanation:\n 'Las condiciones de `si`, `mientras`, `hasta_que` y `para` tienen que ser `verdadero` o `falso`. En otros lenguajes `si (x)` funciona con números; en Codexivo se dice lo que se quiere preguntar: `si (x es_distinto_de 0)`.',\n },\n CONSTANTE_REASIGNADA: {\n kind: 'ejecución',\n explanation:\n 'Una `constante` no cambia de valor. Si necesitas cambiarlo, declárala con `variable` en lugar de `constante`.',\n },\n DICCIONARIO_MODIFICADO_AL_RECORRER: {\n kind: 'ejecución',\n explanation:\n 'Se agregaron o quitaron claves de un diccionario mientras `para_cada` lo recorría. Recorre `claves(d)`, que es una lista nueva, o junta los cambios y aplícalos al terminar.',\n },\n DIVISIÓN_ENTRE_CERO: {\n kind: 'ejecución',\n explanation:\n 'Dividir entre cero (con `/`, `div`, `mod` o `%`) no tiene resultado. Revisa el divisor antes de dividir.',\n },\n LISTA_MODIFICADA_AL_RECORRER: {\n kind: 'ejecución',\n explanation:\n 'La lista cambió de tamaño mientras `para_cada` la recorría, así que no queda claro qué elemento sigue. Cambiar elementos está bien; para agregar o quitar, recorre una copia o junta los cambios en otra lista.',\n },\n LISTA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'El procedimiento necesita al menos un elemento y la lista está vacía. Revisa antes con `longitud(lista) > 0`.',\n },\n MIEMBRO_DE_SOLO_LECTURA: {\n kind: 'ejecución',\n explanation:\n 'Desde fuera de un dominio solo se pueden cambiar sus miembros declarados con `variable`. Sus constantes, sus procedimientos y los dominios que contiene quedan fijos, para que `calculadora.suma` siempre sea el mismo procedimiento.',\n },\n MIEMBRO_INEXISTENTE: {\n kind: 'ejecución',\n explanation:\n 'El dominio no tiene un miembro con ese nombre. Puede estar mal escrito; los miembros se declaran dentro de las llaves del dominio y desde fuera no se pueden agregar.',\n },\n MOCHILA_VACÍA: {\n kind: 'ejecución',\n explanation: 'El robot intentó dejar un zumbador sin tener ninguno. Pregunta antes con `tengo_zumbadores()`.',\n },\n NOMBRE_DESCONOCIDO: {\n kind: 'ejecución',\n explanation:\n 'No hay ninguna variable ni procedimiento con ese nombre a la vista. Puede estar mal escrito, declararse más abajo, o haberse declarado dentro de un bloque que ya terminó.',\n },\n NOMBRE_RESERVADO_POR_BIBLIOTECA: {\n kind: 'ejecución',\n explanation:\n 'Ese nombre es de la biblioteca de Codexivo y no se le puede asignar un valor. Si quieres una variable propia con ese nombre, declárala con `variable`; mientras exista, oculta al de la biblioteca.',\n },\n NO_ES_NÚMERO: {\n kind: 'ejecución',\n explanation:\n 'Se esperaba un número y el texto no lo es, como `\"doce\"` o `\"3,5\"`. Los decimales se escriben con punto: `\"3.5\"`.',\n },\n NO_ES_PROCEDIMIENTO: {\n kind: 'ejecución',\n explanation:\n 'Se intentó llamar con `( )` a algo que no es un procedimiento, como un número o una lista. Revisa que no estés usando una variable con el mismo nombre que el procedimiento.',\n },\n OPERANDO_NO_LÓGICO: {\n kind: 'ejecución',\n explanation:\n '`y`, `o` y `no` unen valores `verdadero` o `falso`. Para preguntar algo sobre un número o un texto, compáralo primero: `x > 0 y nombre != \"\"`.',\n },\n PARA_LÍMITE_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'En `para i desde a hasta b con_paso p`, el inicio, el final y el paso tienen que ser números. Si vienen de `leer()`, conviértelos con `número(…)` o usa `leer_número()`.',\n },\n PARA_PASO_CERO: {\n kind: 'ejecución',\n explanation:\n 'Con `con_paso 0`, la variable nunca cambiaría y el `para` no llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n },\n PARA_SENTIDO_CONTRARIO: {\n kind: 'ejecución',\n explanation:\n 'El paso va en el sentido contrario al que hay que recorrer: por ejemplo, `para i desde 10 hasta 1` sin paso cuenta hacia arriba y nunca llegaría al 1. Codexivo no lo invierte solo ni hace cero vueltas en silencio: para contar hacia atrás escribe `con_paso -1`.',\n },\n PARA_CADA_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n '`para_cada` recorre listas, textos y diccionarios. Para contar se recorre un rango (`para_cada i en rango(1, 10)`), y la forma con dos variables (`para_cada clave, valor en d`) es solo para diccionarios.',\n },\n PILA_VACÍA: {\n kind: 'ejecución',\n explanation:\n 'Se intentó sacar o consultar el tope de una pila que no tiene nada. Revisa antes con `longitud(pila) > 0`.',\n },\n POTENCIA_INVÁLIDA: {\n kind: 'ejecución',\n explanation:\n 'Un número negativo elevado a un exponente con decimales, como `(-8) ^ 0.5`, no tiene un resultado real. Con exponentes enteros sí funciona.',\n },\n RANGO_DEMASIADO_GRANDE: {\n kind: 'ejecución',\n explanation:\n 'El `rango` tendría millones de números, lo que casi siempre es un error en el inicio, el final o el paso. Revísalos.',\n },\n RANGO_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'En `subtexto` y `rebanar`, el inicio no puede estar después del fin. El fin no se incluye: `subtexto(\"hola\", 1, 3)` es `\"ol\"`.',\n },\n RANGO_PASO_CERO: {\n kind: 'ejecución',\n explanation:\n 'Con paso 0, `rango` nunca llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo.',\n },\n RAÍZ_DE_NEGATIVO: {\n kind: 'ejecución',\n explanation: 'La raíz cuadrada solo existe para números de 0 en adelante.',\n },\n REPETICIONES_INVÁLIDAS: {\n kind: 'ejecución',\n explanation:\n '`repetir n veces` necesita que `n` sea un número entero, 0 o más. Con un texto, conviértelo con `número(…)`; con decimales, redondéalo.',\n },\n ROBOT_APAGADO: {\n kind: 'ejecución',\n explanation: 'Después de `apagar()` el robot ya no hace ninguna acción. `apagar()` va al final del programa.',\n },\n SEPARADOR_VACÍO: {\n kind: 'ejecución',\n explanation:\n '`dividir` y `reemplazar` necesitan un texto que buscar que no esté vacío. Para separar letra por letra, usa `caracteres(t)`.',\n },\n SIN_ENTRADA: {\n kind: 'ejecución',\n explanation:\n '`leer_número()` no encontró más datos de entrada. Revisa cuántos datos espera el programa y cuántos se le dieron.',\n },\n SIN_ZUMBADORES: {\n kind: 'ejecución',\n explanation: 'El robot intentó recoger un zumbador donde no hay. Pregunta antes con `hay_zumbador()`.',\n },\n TEXTO_INMUTABLE: {\n kind: 'ejecución',\n explanation:\n 'Los textos no se cambian letra por letra: `t[0] = \"H\"` es un error. Se construye un texto nuevo, por ejemplo uniendo partes con `+` o con `reemplazar`.',\n },\n TIPOS_MEZCLADOS: {\n kind: 'ejecución',\n explanation:\n '`+` suma dos números o une dos textos, pero no mezcla: `\"Total: \" + 5` es un error. Convierte el número con `texto(5)`, o imprime los dos por separado: `imprimir(\"Total:\", 5)`.',\n },\n TIPO_DE_ARGUMENTO: {\n kind: 'ejecución',\n explanation:\n 'Un procedimiento de la biblioteca recibió un valor de un tipo que no acepta, como un texto donde esperaba un número. El mensaje dice qué esperaba y qué recibió.',\n },\n TIPO_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'El operador no funciona con esos tipos, como `-` entre dos textos o `no` con un número. Revisa qué valor tiene cada lado.',\n },\n VARIABLE_DE_PARA: {\n kind: 'ejecución',\n explanation:\n 'La variable de `para i desde … hasta …` avanza sola en cada vuelta, así que no se puede cambiar dentro del bucle. Si necesitas otro valor, guárdalo en una variable nueva; si necesitas controlar el avance a mano, usa `mientras`.',\n },\n VARIABLE_NO_DECLARADA: {\n kind: 'ejecución',\n explanation:\n 'Se le asignó un valor a una variable que no existe. La primera vez se declara con `variable x = …`; después se cambia con `x = …`.',\n },\n VARIABLE_REPETIDA: {\n kind: 'ejecución',\n explanation:\n 'La variable ya existe en este bloque. Para cambiar su valor se escribe `x = …`, sin `variable`. Un bloque interno sí puede declarar otra con el mismo nombre.',\n },\n ÍNDICE_FUERA_DE_RANGO: {\n kind: 'ejecución',\n explanation:\n 'Las posiciones van de 0 a `longitud - 1` (o de -1 a `-longitud` desde el final). Un error clásico es usar `longitud(lista)` como índice: el último es `longitud(lista) - 1`.',\n },\n ÍNDICE_INVÁLIDO: {\n kind: 'ejecución',\n explanation:\n 'La posición de una lista o texto tiene que ser un número entero. Las claves de texto son para diccionarios.',\n },\n ÍNDICE_NO_SOPORTADO: {\n kind: 'ejecución',\n explanation:\n '`[ ]` funciona con listas, textos y diccionarios, y `.campo` solo con diccionarios. Revisa qué valor tiene la variable.',\n },\n\n // límite\n DEMASIADAS_LLAMADAS: {\n kind: 'límite',\n explanation:\n 'Hay demasiadas llamadas anidadas, casi siempre por una recursión sin caso base: el procedimiento se llama a sí mismo sin una condición que lo detenga.',\n },\n DEMASIADAS_OPERACIONES: {\n kind: 'límite',\n explanation:\n 'El programa hizo más operaciones de las permitidas. Casi siempre es un bucle cuya condición nunca cambia; revisa que algo dentro del bucle lo acerque al final.',\n },\n DEMASIADA_SALIDA: {\n kind: 'límite',\n explanation:\n 'El programa imprimió demasiado texto, casi siempre por un `imprimir` dentro de un bucle que no termina.',\n },\n};\n",
|
|
20
|
+
"import { ERROR_CODES } from './error-codes';\nimport type { ErrorKind } from './errors';\nimport { constantDocs, constants, natives, withoutAccents } from './runtime/builtins';\nimport { libraryDocs } from './runtime/prelude';\nimport type { ProcedureCategory, ProcedureDoc, ProcedureLevel } from './runtime/values';\nimport { KEYWORDS, TokenType } from './syntax/token';\nimport { EXAMPLE_WORLD, worldDocs } from './world';\nimport type { WorldDefinition } from './world';\n\n/**\n * El lenguaje y su biblioteca como datos, para que el resaltado, el autocompletado, la documentación y los\n * avisos del editor del sitio salgan de una sola fuente. Todo es serializable: no hay funciones.\n */\n\nexport type KeywordGroup = 'declaración' | 'control' | 'lógicas' | 'literales' | 'operadores';\n\nexport interface OperatorEntry {\n symbol?: string;\n /** Forma en palabras (`es_igual_a`, `mod`), si la tiene. */\n word?: string;\n /** Nivel de precedencia de la §4.1: 1 es el que agrupa al final, 9 el primero. */\n precedence: number;\n associativity: 'izquierda' | 'derecha' | 'prefijo' | 'sin encadenar';\n description: string;\n}\n\nexport interface ProcedureEntry extends ProcedureDoc {\n /** Nombre canónico, con acento si lo lleva. */\n name: string;\n /** Otras formas aceptadas (el nombre sin acento). */\n aliases: string[];\n}\n\nexport interface ConstantEntry {\n name: string;\n value: number;\n level: ProcedureLevel;\n description: string;\n}\n\nexport interface ErrorEntry {\n code: string;\n kind: ErrorKind;\n explanation: string;\n}\n\nexport interface Catalog {\n version: 1;\n keywords: Array<{ group: KeywordGroup; words: string[] }>;\n operators: OperatorEntry[];\n /** Procedimientos de la biblioteca, incluidos los del modo mundo (categoría `mundo`). */\n library: ProcedureEntry[];\n constants: ConstantEntry[];\n errors: ErrorEntry[];\n categories: ProcedureCategory[];\n /** Mundo con el que se ejecutan los ejemplos de la categoría `mundo`. */\n exampleWorld: WorldDefinition;\n}\n\nconst KEYWORD_GROUPS: Readonly<Record<string, KeywordGroup>> = {\n [TokenType.LET]: 'declaración',\n [TokenType.CONST]: 'declaración',\n [TokenType.DOMAIN]: 'declaración',\n [TokenType.FUNCTION]: 'declaración',\n [TokenType.RETURN]: 'declaración',\n [TokenType.IF]: 'control',\n [TokenType.ELSEIF]: 'control',\n [TokenType.ELSE]: 'control',\n [TokenType.WHILE]: 'control',\n [TokenType.DO]: 'control',\n [TokenType.UNTIL]: 'control',\n [TokenType.FOR]: 'control',\n [TokenType.FOR_EACH]: 'control',\n [TokenType.FROM]: 'control',\n [TokenType.TO]: 'control',\n [TokenType.STEP]: 'control',\n [TokenType.IN]: 'control',\n [TokenType.REPEAT]: 'control',\n [TokenType.TIMES]: 'control',\n [TokenType.BREAK]: 'control',\n [TokenType.CONTINUE]: 'control',\n [TokenType.AND]: 'lógicas',\n [TokenType.OR]: 'lógicas',\n [TokenType.NOT]: 'lógicas',\n [TokenType.TRUE]: 'literales',\n [TokenType.FALSE]: 'literales',\n [TokenType.NULL]: 'literales',\n [TokenType.MOD]: 'operadores',\n [TokenType.DIV]: 'operadores',\n [TokenType.EQ]: 'operadores',\n [TokenType.NEQ]: 'operadores',\n [TokenType.LT]: 'operadores',\n [TokenType.GT]: 'operadores',\n [TokenType.LTE]: 'operadores',\n [TokenType.GTE]: 'operadores',\n};\n\nconst GROUP_ORDER: KeywordGroup[] = ['declaración', 'control', 'lógicas', 'literales', 'operadores'];\n\n/** Grupo de cada palabra reservada; una palabra sin grupo es un error del catálogo (lo revisa una prueba). */\nexport const keywordGroup = (word: string): KeywordGroup | undefined => KEYWORD_GROUPS[KEYWORDS[word] ?? ''];\n\nconst keywords = GROUP_ORDER.map(group => ({\n group,\n words: Object.keys(KEYWORDS).filter(word => keywordGroup(word) === group),\n}));\n\nconst operators: OperatorEntry[] = [\n {\n word: 'o',\n precedence: 1,\n associativity: 'izquierda',\n description: 'Verdadero si alguno de los dos lo es. Si el izquierdo es verdadero, no evalúa el derecho.',\n },\n {\n word: 'y',\n precedence: 2,\n associativity: 'izquierda',\n description: 'Verdadero si los dos lo son. Si el izquierdo es falso, no evalúa el derecho.',\n },\n {\n symbol: '!',\n word: 'no',\n precedence: 3,\n associativity: 'prefijo',\n description: 'Cambia verdadero por falso y al revés.',\n },\n {\n symbol: '==',\n word: 'es_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Igualdad por valor, también de listas y diccionarios.',\n },\n {\n symbol: '!=',\n word: 'es_distinto_de',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Lo contrario de `==`.',\n },\n {\n symbol: '<',\n word: 'es_menor_que',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '>',\n word: 'es_mayor_que',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '<=',\n word: 'es_menor_o_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '>=',\n word: 'es_mayor_o_igual_a',\n precedence: 4,\n associativity: 'sin encadenar',\n description: 'Compara dos números o dos textos.',\n },\n {\n symbol: '+',\n precedence: 5,\n associativity: 'izquierda',\n description: 'Suma dos números o une dos textos; no los mezcla.',\n },\n { symbol: '-', precedence: 5, associativity: 'izquierda', description: 'Resta.' },\n { symbol: '*', precedence: 6, associativity: 'izquierda', description: 'Multiplica.' },\n { symbol: '/', precedence: 6, associativity: 'izquierda', description: 'División real: `7 / 2` es `3.5`.' },\n {\n word: 'div',\n precedence: 6,\n associativity: 'izquierda',\n description: 'División entera hacia abajo: `-7 div 2` es `-4`.',\n },\n {\n symbol: '%',\n word: 'mod',\n precedence: 6,\n associativity: 'izquierda',\n description: 'Residuo consistente con `div`: `-7 mod 3` es `2`.',\n },\n { symbol: '-', precedence: 7, associativity: 'prefijo', description: 'Cambia el signo.' },\n {\n symbol: '^',\n precedence: 8,\n associativity: 'derecha',\n description: 'Potencia: `2 ^ 3 ^ 2` es `2 ^ 9`, y `-2 ^ 2` es `-4`.',\n },\n { symbol: '( )', precedence: 9, associativity: 'izquierda', description: 'Llama a un procedimiento: `f(x)`.' },\n {\n symbol: '[ ]',\n precedence: 9,\n associativity: 'izquierda',\n description: 'Elemento de una lista o texto, o clave de un diccionario: `l[0]`, `d[\"a\"]`.',\n },\n {\n symbol: '.',\n precedence: 9,\n associativity: 'izquierda',\n description: 'Campo de un diccionario: `persona.edad` es `persona[\"edad\"]`.',\n },\n];\n\nconst entry = (name: string, doc: ProcedureDoc): ProcedureEntry => {\n const alias = withoutAccents(name);\n return { name, aliases: alias === name ? [] : [alias], ...doc };\n};\n\nconst library: ProcedureEntry[] = [\n ...Object.values(natives)\n .filter((native, index, all) => all.indexOf(native) === index)\n .map(native => entry(native.name, native.doc!)),\n ...Object.entries(libraryDocs).map(([name, doc]) => entry(name, doc)),\n ...Object.entries(worldDocs).map(([name, doc]) => entry(name, doc)),\n];\n\nconst CATEGORIES: ProcedureCategory[] = [\n 'entrada y salida',\n 'tipos',\n 'verificación',\n 'matemáticas',\n 'texto',\n 'listas',\n 'diccionarios',\n 'procedimientos',\n 'estructuras',\n 'mundo',\n];\n\nexport const catalog: Catalog = {\n version: 1,\n keywords,\n operators,\n library: library.sort(\n (a, b) => CATEGORIES.indexOf(a.category) - CATEGORIES.indexOf(b.category) || a.name.localeCompare(b.name, 'es'),\n ),\n constants: Object.entries(constantDocs).map(([name, doc]) => ({\n name,\n value: constants[name] as number,\n ...doc,\n })),\n errors: Object.entries(ERROR_CODES)\n .map(([code, info]) => ({ code, ...info }))\n .sort((a, b) => a.code.localeCompare(b.code, 'es')),\n categories: CATEGORIES,\n exampleWorld: EXAMPLE_WORLD,\n};\n",
|
|
21
21
|
"import type * as ast from './syntax/ast';\nimport { repr } from './runtime/values';\n\n/**\n * Convierte nodos del AST en texto corto de Codexivo (`suma += i`, `i <= 10`). Lo usan el diagrama de flujo y\n * cualquier vista que necesite mostrar una parte del programa sin copiar el código original.\n */\n\n/** Precedencia de la §4.1 (mayor agrupa primero), para poner paréntesis solo donde hacen falta. */\nconst precedence = (node: ast.Expression): number => {\n switch (node.kind) {\n case 'Logical':\n return node.operator === 'o' ? 1 : 2;\n case 'Unary':\n return node.operator === 'no' ? 3 : 7;\n case 'Binary':\n switch (node.operator) {\n case '==':\n case '!=':\n case '<':\n case '>':\n case '<=':\n case '>=':\n return 4;\n case '+':\n case '-':\n return 5;\n case '^':\n return 8;\n default:\n return 6;\n }\n default:\n return 10;\n }\n};\n\nconst operand = (node: ast.Expression, parent: number, wrapEqual: boolean): string => {\n const text = printExpression(node);\n const own = precedence(node);\n return own < parent || (wrapEqual && own === parent) ? `(${text})` : text;\n};\n\nexport const printExpression = (node: ast.Expression): string => {\n switch (node.kind) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return repr(node.value);\n case 'NullLiteral':\n return 'nulo';\n case 'Identifier':\n return node.name;\n case 'ListLiteral':\n return `[${node.elements.map(printExpression).join(', ')}]`;\n case 'DictLiteral':\n return node.entries.length === 0\n ? '{}'\n : `{ ${node.entries\n .map(entry => {\n const key = printExpression(entry.key);\n const literal = entry.key.kind === 'StringLiteral' || entry.key.kind === 'NumberLiteral';\n return `${literal ? key : `(${key})`}: ${printExpression(entry.value)}`;\n })\n .join(', ')} }`;\n case 'Unary': {\n const own = precedence(node);\n const inner = operand(node.operand, own, false);\n return node.operator === 'no' ? `no ${inner}` : `-${inner}`;\n }\n case 'Binary':\n case 'Logical': {\n const own = precedence(node);\n // `^` agrupa a la derecha; los demás, a la izquierda. Las comparaciones no se encadenan.\n const right = node.kind === 'Binary' && node.operator === '^';\n const compare = own === 4;\n const left = operand(node.left, own, right || compare);\n const rightText = operand(node.right, own, !right || compare);\n return `${left} ${node.operator} ${rightText}`;\n }\n case 'Call':\n return `${operand(node.callee, 10, false)}(${node.args.map(printExpression).join(', ')})`;\n case 'Index':\n if (node.dot && node.index.kind === 'StringLiteral')\n return `${operand(node.object, 10, false)}.${node.index.value}`;\n return `${operand(node.object, 10, false)}[${printExpression(node.index)}]`;\n case 'FunctionLiteral':\n return `procedimiento(${node.params.map(param => param.name).join(', ')}) { … }`;\n }\n};\n\n/**\n * Una sentencia en una línea. Las compuestas se resumen con su encabezado: `si (x > 0)`, `repetir 3 veces`,\n * `para_cada x en lista`.\n */\nexport const printStatement = (node: ast.Statement): string => {\n switch (node.kind) {\n case 'VariableDeclaration':\n return `${node.constant ? 'constante' : 'variable'} ${node.name.name} = ${printExpression(node.value)}`;\n case 'FunctionDeclaration':\n return `procedimiento ${node.name.name}(${node.function.params.map(param => param.name).join(', ')})`;\n case 'Assignment':\n return `${printExpression(node.target)} ${node.operator} ${printExpression(node.value)}`;\n case 'Increment':\n return `${printExpression(node.target)}${node.operator}`;\n case 'ExpressionStatement':\n return printExpression(node.expression);\n case 'Return':\n return node.value ? `regresa ${printExpression(node.value)}` : 'regresa';\n case 'Domain':\n return `dominio ${node.name.name}`;\n case 'Break':\n return 'romper';\n case 'Continue':\n return 'continuar';\n case 'Block':\n return '{ … }';\n case 'If':\n return `si (${printExpression(node.branches[0]!.condition)})`;\n case 'While':\n return `mientras (${printExpression(node.condition)})`;\n case 'DoUntil':\n return `hasta_que (${printExpression(node.condition)})`;\n case 'For':\n return `para (${node.condition ? printExpression(node.condition) : ''})`;\n case 'Repeat':\n return `repetir ${printExpression(node.count)} veces`;\n case 'ForRange':\n return `para ${node.variable.name} desde ${printExpression(node.from)} hasta ${printExpression(node.to)}${node.step ? ` con_paso ${printExpression(node.step)}` : ''}`;\n case 'ForEach':\n return `para_cada ${node.variable.name}${node.value ? `, ${node.value.name}` : ''} en ${printExpression(node.iterable)}`;\n }\n};\n",
|
|
22
22
|
"import type * as ast from './syntax/ast';\nimport type { Span } from './syntax/token';\nimport { printExpression, printStatement } from './printer';\n\n/**\n * Diagrama de flujo generado desde el AST. Aquí se decide qué nodos y aristas existen; el sitio solo los\n * acomoda (con ELK o dagre) y los dibuja. Con los eventos `paso` y `decide` de la máquina (`nodeId`), el sitio\n * sabe qué nodo iluminar: cada `nodeId` que emite la ejecución aparece en `astIds` de algún nodo del grafo.\n */\n\nexport type FlowNodeKind = 'inicio' | 'fin' | 'proceso' | 'decisión' | 'llamada' | 'entrada' | 'salida' | 'retorno';\n\nexport interface FlowNode {\n id: string;\n kind: FlowNodeKind;\n /** Texto corto para mostrar, generado desde el AST. Si se agruparon sentencias, una por línea. */\n label: string;\n /** Nodos del AST que representa: la sentencia y, en una decisión, también su condición. */\n astIds: number[];\n spans: Span[];\n /** Orden sugerido para acomodar el grafo: distancia desde el inicio sin contar las vueltas de los bucles. */\n rank: number;\n /** En una llamada a un procedimiento del programa: su nombre, para enlazar con `procedures`. */\n procedure?: string;\n}\n\n/**\n * - `normal`: sigue a la siguiente sentencia (o entra o sale de un bucle);\n * - `vuelta`: regresa al inicio de un bucle;\n * - `romper`, `continuar`, `regresa`: saltos explícitos.\n */\nexport type FlowEdgeKind = 'normal' | 'vuelta' | 'romper' | 'continuar' | 'regresa';\n\n/** Etiqueta de una arista que sale de una decisión. */\nexport type FlowEdgeLabel = 'sí' | 'no' | 'repetir' | 'salir';\n\nexport interface FlowEdge {\n id: string;\n from: string;\n to: string;\n kind: FlowEdgeKind;\n label?: FlowEdgeLabel;\n}\n\nexport interface FlowGraph {\n nodes: FlowNode[];\n edges: FlowEdge[];\n /** Con `expandProcedures`, el grafo de cada procedimiento con nombre del programa. */\n procedures?: Array<{ name: string; astId: number; graph: FlowGraph }>;\n}\n\nexport interface FlowOptions {\n /** Junta sentencias simples consecutivas (asignaciones, declaraciones) en un solo nodo de proceso. */\n group?: boolean;\n /** Genera también el grafo de cada procedimiento con nombre y marca las llamadas a ellos. */\n expandProcedures?: boolean;\n /** Recorta las etiquetas largas a esta cantidad de caracteres, con `…`. Por defecto no se recortan. */\n maxLabelLength?: number;\n}\n\ninterface Pending {\n from: string;\n kind?: FlowEdgeKind;\n label?: FlowEdgeLabel;\n}\n\ninterface Loop {\n breaks: Pending[];\n continues: Pending[];\n}\n\nconst INPUT = new Set(['leer', 'leer_número', 'leer_numero']);\nconst OUTPUT = new Set(['imprimir']);\n\n/** `f` o `dominio.f`: la ruta de un nombre, si la expresión es solo eso. */\nconst path = (node: ast.Expression): string | undefined => {\n if (node.kind === 'Identifier') return node.name;\n if (node.kind === 'Index' && node.dot && node.index.kind === 'StringLiteral') {\n const object = path(node.object);\n return object && `${object}.${node.index.value}`;\n }\n return undefined;\n};\n\n/** Nombre (o ruta) del procedimiento al que llama una expresión, si es una llamada directa. */\nconst calledName = (node: ast.Expression | undefined): string | undefined =>\n node?.kind === 'Call' ? path(node.callee) : undefined;\n\nclass Builder {\n readonly nodes: FlowNode[] = [];\n readonly edges: FlowEdge[] = [];\n private readonly loops: Loop[] = [];\n private readonly returns: Pending[] = [];\n /** Último nodo de proceso, al que se le pueden juntar sentencias con `group`. */\n private groupable?: string;\n\n constructor(\n private readonly options: FlowOptions,\n private readonly procedures: Set<string>,\n ) {}\n\n private label(text: string): string {\n const max = this.options.maxLabelLength;\n return max && text.length > max ? `${text.slice(0, Math.max(1, max - 1))}…` : text;\n }\n\n node(kind: FlowNodeKind, label: string, astNodes: Array<{ id: number; span: Span }>): string {\n const id = `n${this.nodes.length}`;\n this.nodes.push({\n id,\n kind,\n label: this.label(label),\n astIds: astNodes.map(node => node.id),\n spans: astNodes.map(node => node.span),\n rank: 0,\n });\n this.groupable = undefined;\n return id;\n }\n\n connect(pending: Pending[], to: string): void {\n for (const { from, kind = 'normal', label } of pending) {\n this.edges.push({ id: `e${this.edges.length}`, from, to, kind, ...(label ? { label } : {}) });\n }\n }\n\n /** Un nodo simple con sus aristas de entrada; regresa la arista pendiente que sale de él. */\n private simple(kind: FlowNodeKind, statement: ast.Statement, incoming: Pending[], procedure?: string): Pending[] {\n const groupable = kind === 'proceso' && this.options.group;\n const last = this.groupable ? this.nodes.find(node => node.id === this.groupable) : undefined;\n if (groupable && last && incoming.length === 1 && incoming[0]!.from === last.id && !incoming[0]!.label) {\n last.label = `${last.label}\\n${this.label(printStatement(statement))}`;\n last.astIds.push(statement.id);\n last.spans.push(statement.span);\n return incoming;\n }\n const id = this.node(kind, printStatement(statement), [statement]);\n if (procedure) this.nodes[this.nodes.length - 1]!.procedure = procedure;\n this.connect(incoming, id);\n if (groupable) this.groupable = id;\n return [{ from: id }];\n }\n\n private kindOf(statement: ast.Statement): { kind: FlowNodeKind; procedure?: string } {\n const expression =\n statement.kind === 'ExpressionStatement'\n ? statement.expression\n : statement.kind === 'VariableDeclaration' || statement.kind === 'Assignment'\n ? statement.value\n : undefined;\n const name = calledName(expression);\n if (name && INPUT.has(name)) return { kind: 'entrada' };\n if (name && OUTPUT.has(name) && statement.kind === 'ExpressionStatement') return { kind: 'salida' };\n if (name && this.procedures.has(name)) {\n return this.options.expandProcedures ? { kind: 'llamada', procedure: name } : { kind: 'llamada' };\n }\n if (statement.kind === 'ExpressionStatement' && name) return { kind: 'llamada' };\n return { kind: 'proceso' };\n }\n\n statements(list: ast.Statement[], incoming: Pending[]): Pending[] {\n let current = incoming;\n for (const statement of list) current = this.statement(statement, current);\n return current;\n }\n\n private loop(body: () => Pending[]): { out: Pending[]; loop: Loop } {\n const loop: Loop = { breaks: [], continues: [] };\n this.loops.push(loop);\n const out = body();\n this.loops.pop();\n return { out, loop };\n }\n\n private back(pending: Pending[], kind: FlowEdgeKind = 'vuelta'): Pending[] {\n return pending.map(edge => (edge.kind && edge.kind !== 'normal' ? edge : { ...edge, kind }));\n }\n\n private statement(statement: ast.Statement, incoming: Pending[]): Pending[] {\n switch (statement.kind) {\n case 'FunctionDeclaration':\n // Se crea al entrar al bloque, no en este punto; su grafo va en `procedures`.\n return incoming;\n case 'Domain': {\n // Un dominio solo declara: es un paso de proceso que representa todas sus declaraciones.\n const members: ast.Statement[] = [];\n const collect = (domain: ast.Domain) => {\n members.push(domain);\n for (const member of domain.body.statements) {\n if (member.kind === 'VariableDeclaration') members.push(member);\n else if (member.kind === 'Domain') collect(member);\n }\n };\n collect(statement);\n const id = this.node('proceso', printStatement(statement), members);\n this.connect(incoming, id);\n return [{ from: id }];\n }\n case 'VariableDeclaration':\n case 'Assignment':\n case 'Increment':\n case 'ExpressionStatement': {\n const { kind, procedure } = this.kindOf(statement);\n return this.simple(kind, statement, incoming, procedure);\n }\n case 'Return': {\n const id = this.node('retorno', printStatement(statement), [statement]);\n this.connect(incoming, id);\n this.returns.push({ from: id, kind: 'regresa' });\n return [];\n }\n case 'Break':\n case 'Continue': {\n const id = this.node('proceso', printStatement(statement), [statement]);\n this.connect(incoming, id);\n const loop = this.loops[this.loops.length - 1];\n if (statement.kind === 'Break') loop?.breaks.push({ from: id, kind: 'romper' });\n else loop?.continues.push({ from: id, kind: 'continuar' });\n return [];\n }\n case 'Block':\n return this.statements(statement.statements, incoming);\n case 'If': {\n let pending = incoming;\n const out: Pending[] = [];\n statement.branches.forEach((branch, index) => {\n const astNodes = index === 0 ? [statement, branch.condition] : [branch.condition];\n const id = this.node('decisión', printExpression(branch.condition), astNodes);\n this.connect(pending, id);\n out.push(...this.statements(branch.body.statements, [{ from: id, label: 'sí' }]));\n pending = [{ from: id, label: 'no' }];\n });\n if (statement.alternative) out.push(...this.statements(statement.alternative.statements, pending));\n else out.push(...pending);\n return out;\n }\n case 'While': {\n const id = this.node('decisión', printExpression(statement.condition), [statement, statement.condition]);\n this.connect(incoming, id);\n const { out, loop } = this.loop(() => this.statements(statement.body.statements, [{ from: id, label: 'sí' }]));\n this.connect(this.back([...out, ...loop.continues]), id);\n return [{ from: id, label: 'no' }, ...loop.breaks];\n }\n case 'DoUntil': {\n // El cuerpo va primero; la entrada al bucle se conecta al primer nodo que cree.\n const first = this.nodes.length;\n const { out, loop } = this.loop(() => this.statements(statement.body.statements, incoming));\n const id = this.node('decisión', `hasta_que ${printExpression(statement.condition)}`, [\n statement,\n statement.condition,\n ]);\n this.connect([...out, ...loop.continues], id);\n const start = this.nodes[first]?.id ?? id;\n this.connect([{ from: id, label: 'no', kind: 'vuelta' }], start);\n if (start === id) this.edges.pop(); // cuerpo vacío: la vuelta sería un lazo sobre sí misma\n return [{ from: id, label: 'sí' }, ...loop.breaks];\n }\n case 'For': {\n let pending = incoming;\n const initOwner: ast.Statement[] = [];\n if (statement.init) {\n this.groupable = undefined;\n const before = this.nodes.length;\n pending = this.statement(statement.init, pending);\n // El paso del `para` se ilumina en su inicio.\n this.nodes[before]?.astIds.unshift(statement.id);\n this.nodes[before]?.spans.unshift(statement.span);\n } else {\n initOwner.push(statement);\n }\n const condition = statement.condition;\n const id = this.node('decisión', condition ? printExpression(condition) : 'verdadero', [\n ...initOwner,\n ...(condition ? [condition] : []),\n ]);\n this.connect(pending, id);\n const { out, loop } = this.loop(() => this.statements(statement.body.statements, [{ from: id, label: 'sí' }]));\n let tail = [...out, ...loop.continues];\n if (statement.update) tail = this.statement(statement.update, tail);\n this.connect(this.back(tail), id);\n return [...(condition ? [{ from: id, label: 'no' as const }] : []), ...loop.breaks];\n }\n case 'Repeat':\n case 'ForRange':\n case 'ForEach': {\n const head =\n statement.kind === 'Repeat'\n ? statement.count\n : statement.kind === 'ForRange'\n ? statement.to\n : statement.iterable;\n const id = this.node('decisión', printStatement(statement), [statement, head]);\n this.connect(incoming, id);\n const { out, loop } = this.loop(() =>\n this.statements(statement.body.statements, [{ from: id, label: 'repetir' }]),\n );\n this.connect(this.back([...out, ...loop.continues]), id);\n return [{ from: id, label: 'salir' }, ...loop.breaks];\n }\n }\n }\n\n finish(start: string, out: Pending[]): void {\n const end = this.node('fin', 'fin', []);\n this.connect([...out, ...this.returns], end);\n // Rango: distancia más larga desde el inicio sin contar vueltas (el grafo sin ellas no tiene ciclos).\n const forward = this.edges.filter(edge => edge.kind !== 'vuelta' && edge.kind !== 'continuar');\n const rank = new Map<string, number>([[start, 0]]);\n for (let changed = true, guard = 0; changed && guard <= this.nodes.length; guard++) {\n changed = false;\n for (const edge of forward) {\n const next = (rank.get(edge.from) ?? -1) + 1;\n if (rank.has(edge.from) && next > (rank.get(edge.to) ?? -1)) {\n rank.set(edge.to, next);\n changed = true;\n }\n }\n }\n for (const node of this.nodes) node.rank = rank.get(node.id) ?? 0;\n }\n}\n\n/** Procedimientos con nombre declarados en estas sentencias, con su ruta si están en un dominio. */\nconst procedureNames = (statements: ast.Statement[], known: Iterable<string> = []): Set<string> => {\n const names = new Set(known);\n const visit = (list: ast.Statement[], prefix: string) => {\n for (const statement of list) {\n if (statement.kind === 'FunctionDeclaration') names.add(`${prefix}${statement.name.name}`);\n if (statement.kind === 'Domain') visit(statement.body.statements, `${prefix}${statement.name.name}.`);\n }\n };\n visit(statements, '');\n return names;\n};\n\n/**\n * Grafo de flujo de un programa o de un procedimiento. El AST tiene que venir sin errores de sintaxis.\n */\nexport const flowGraph = (\n root: ast.Program | ast.FunctionLiteral | ast.FunctionDeclaration,\n options: FlowOptions = {},\n): FlowGraph => graphOf(root, options, []);\n\nconst graphOf = (\n root: ast.Program | ast.FunctionLiteral | ast.FunctionDeclaration,\n options: FlowOptions,\n known: Iterable<string>,\n): FlowGraph => {\n const statements =\n root.kind === 'Program'\n ? root.statements\n : root.kind === 'FunctionDeclaration'\n ? root.function.body.statements\n : root.body.statements;\n const names = procedureNames(statements, known);\n const builder = new Builder(options, names);\n const title =\n root.kind === 'Program'\n ? 'inicio'\n : root.kind === 'FunctionDeclaration'\n ? printStatement(root)\n : `procedimiento(${root.params.map(param => param.name).join(', ')})`;\n const start = builder.node('inicio', title, root.kind === 'Program' ? [] : [root]);\n const out = builder.statements(statements, [{ from: start }]);\n builder.finish(start, out);\n\n const graph: FlowGraph = { nodes: builder.nodes, edges: builder.edges };\n if (options.expandProcedures) {\n graph.procedures = [];\n // Los procedimientos de un dominio se nombran con su ruta: `calculadora.suma`.\n const visit = (list: ast.Statement[], prefix: string) => {\n for (const statement of list) {\n if (statement.kind === 'Domain') visit(statement.body.statements, `${prefix}${statement.name.name}.`);\n if (statement.kind !== 'FunctionDeclaration') continue;\n graph.procedures!.push({\n name: `${prefix}${statement.name.name}`,\n astId: statement.id,\n graph: graphOf(statement, options, names),\n });\n }\n };\n visit(statements, '');\n }\n return graph;\n};\n",
|
|
23
23
|
"import { run } from './engine';\nimport type { ErrorInfo } from './errors';\nimport { equals, repr } from './runtime/values';\nimport type { DictKey, Value } from './runtime/values';\n\n/**\n * Retos: un conjunto de casos que se ejecutan con su propia entrada y su propio límite de operaciones. Corre\n * igual en el worker del sitio y en Bun, así los retos se prueban en CI.\n *\n * - Estilo `salida` (como HackerRank): el programa lee con `leer()` y se compara lo que imprime.\n * - Estilo `regresa` (como LeetCode): se llama a `resolver(…)` (u otro procedimiento) con argumentos y se compara\n * lo que regresa, por valor.\n */\n\n/** Un valor de JSON: los arreglos se vuelven listas y los objetos, diccionarios. */\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nexport interface ChallengeCase {\n name?: string;\n /** Entrada estándar: un texto (una línea por renglón) o una lista de líneas. */\n input?: string | string[];\n /** Estilo `salida`: lo que el programa tiene que imprimir. */\n expectedOutput?: string;\n /** Estilo `regresa`: los argumentos para el procedimiento. */\n args?: JsonValue[];\n /** Estilo `regresa`: lo que tiene que regresar. */\n expected?: JsonValue;\n /** Límite de operaciones de este caso; si no, el del reto. */\n maxOperations?: number;\n}\n\nexport interface Challenge {\n style: 'salida' | 'regresa';\n cases: ChallengeCase[];\n /** Estilo `regresa`: el procedimiento que se llama. Por defecto `resolver`. */\n procedure?: string;\n /** Límite de operaciones por caso. Por defecto 1 000 000. */\n maxOperations?: number;\n /**\n * Con `true`, la salida tiene que ser idéntica. Si no, se ignoran los espacios al final de cada línea y las\n * líneas vacías del final.\n */\n exactOutput?: boolean;\n}\n\nexport interface CaseResult {\n name: string;\n passed: boolean;\n output: string;\n expectedOutput?: string;\n /** Estilo `regresa`: lo que regresó y lo que se esperaba, como se escribirían en código. */\n result?: string;\n expected?: string;\n operations: number;\n error?: ErrorInfo;\n}\n\nexport interface ChallengeResult {\n passed: boolean;\n cases: CaseResult[];\n}\n\nconst DEFAULT_MAX_OPERATIONS = 1_000_000;\n\n/** Un valor de JSON escrito como literal de Codexivo. */\nconst literal = (value: JsonValue): string => {\n if (value === null) return 'nulo';\n if (typeof value === 'boolean') return value ? 'verdadero' : 'falso';\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error(`El reto tiene un número que no es finito: ${value}.`);\n return value < 0 ? `(${value})` : String(value);\n }\n if (typeof value === 'string') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(literal).join(', ')}]`;\n return `{ ${Object.entries(value)\n .map(([key, item]) => `${JSON.stringify(key)}: ${literal(item)}`)\n .join(', ')} }`;\n};\n\n/** Un valor de JSON como valor de Codexivo, para comparar por valor con `equals`. */\nconst toValue = (value: JsonValue): Value => {\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return { kind: 'lista', id: 0, items: value.map(toValue) };\n return {\n kind: 'diccionario',\n id: 0,\n entries: new Map<DictKey, Value>(Object.entries(value).map(([key, item]) => [key, toValue(item)])),\n };\n};\n\nconst normalize = (text: string): string =>\n text\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n .map(line => line.replace(/[ \\t]+$/, ''))\n .join('\\n')\n .replace(/\\n+$/, '');\n\n/** Ejecuta cada caso del reto con el código de quien lo resuelve. */\nexport const evaluarReto = (source: string, challenge: Challenge): ChallengeResult => {\n const procedure = challenge.procedure ?? 'resolver';\n const cases = challenge.cases.map((testCase, index): CaseResult => {\n const name = testCase.name ?? `Caso ${index + 1}`;\n const maxOperations = testCase.maxOperations ?? challenge.maxOperations ?? DEFAULT_MAX_OPERATIONS;\n const input = testCase.input ?? [];\n\n if (challenge.style === 'salida') {\n const result = run(source, { input, maxOperations });\n const expectedOutput = testCase.expectedOutput ?? '';\n const same = challenge.exactOutput\n ? result.output === expectedOutput\n : normalize(result.output) === normalize(expectedOutput);\n return {\n name,\n passed: result.ok && same,\n output: result.output,\n expectedOutput,\n operations: result.operations,\n ...(result.errors[0] ? { error: result.errors[0] } : {}),\n };\n }\n\n // La llamada va al final, en su propia línea, para que los errores del programa conserven su lugar.\n const call = `\\n;\\nregresa ${procedure}(${(testCase.args ?? []).map(literal).join(', ')});\\n`;\n const result = run(source + call, { input, maxOperations });\n const expected = toValue(testCase.expected ?? null);\n return {\n name,\n passed: result.ok && equals(result.result, expected),\n output: result.output,\n result: result.resultText,\n expected: repr(expected),\n operations: result.operations,\n ...(result.errors[0] ? { error: result.errors[0] } : {}),\n };\n });\n return { passed: cases.every(testCase => testCase.passed), cases };\n};\n",
|
|
24
24
|
"import type { Challenge, ChallengeResult } from './challenge';\nimport type { Loaded, Progress, SandboxOptions, SandboxRequest, SandboxResponse, Stopped } from './sandbox-host';\n\n/** Lo que `createSandbox` necesita de un worker (un `Worker` del navegador o de Bun). */\nexport interface WorkerLike {\n postMessage(message: SandboxRequest): void;\n addEventListener(type: 'message', listener: (event: MessageEvent<SandboxResponse>) => void): void;\n terminate?(): void;\n}\n\nexport interface Sandbox {\n /** Analiza el código; si no tiene errores, queda listo para ejecutarse. */\n load(source: string, options?: SandboxOptions): Promise<Loaded>;\n /** Ejecuta hasta terminar, sin detenerse en los puntos de interrupción. */\n run(): Promise<Stopped>;\n /** Ejecuta hasta el siguiente punto de interrupción, o hasta terminar. */\n resume(): Promise<Stopped>;\n step(): Promise<Stopped>;\n /** Pide pausar; la promesa de `run()` o `resume()` se resuelve con el estado en el que quedó. */\n pause(): Promise<void>;\n /** Retrocede (o avanza) hasta el paso `n` volviendo a ejecutar desde el inicio. */\n goToStep(step: number): Promise<Stopped>;\n provideInput(line: string): Promise<void>;\n closeInput(): Promise<void>;\n setBreakpoints(lines: number[]): Promise<void>;\n evaluarReto(source: string, challenge: Challenge): Promise<ChallengeResult>;\n /** Progreso de cada tanda (operaciones, salida nueva, eventos). Regresa cómo dejar de escuchar. */\n onProgress(listener: (progress: Progress) => void): () => void;\n /** Cada vez que la ejecución se detiene. Regresa cómo dejar de escuchar. */\n onStopped(listener: (stopped: Stopped) => void): () => void;\n terminate(): void;\n}\n\ntype Body<T extends SandboxRequest['type']> = Omit<Extract<SandboxRequest, { type: T }>, 'id'>;\n\n/** Envuelve el worker de `codexivo/worker` con promesas y suscripciones. */\nexport const createSandbox = (worker: WorkerLike): Sandbox => {\n let nextId = 1;\n const pending = new Map<number, { resolve: (value: never) => void; reject: (error: Error) => void }>();\n const progressListeners = new Set<(progress: Progress) => void>();\n const stoppedListeners = new Set<(stopped: Stopped) => void>();\n\n worker.addEventListener('message', ({ data }) => {\n if (data.type === 'progreso') {\n for (const listener of progressListeners) listener(data);\n return;\n }\n if (data.type === 'detenido') for (const listener of stoppedListeners) listener(data);\n const request = pending.get(data.id);\n if (!request) return;\n pending.delete(data.id);\n if (data.type === 'error') request.reject(new Error(data.message));\n else if (data.type === 'hecho') request.resolve(undefined as never);\n else if (data.type === 'reto') request.resolve(data.result as never);\n else request.resolve(data as never);\n });\n\n const send = <T extends SandboxRequest['type'], R>(type: T, body: Omit<Body<T>, 'type'> = {} as never) =>\n new Promise<R>((resolve, reject) => {\n const id = nextId++;\n pending.set(id, { resolve: resolve as (value: never) => void, reject });\n worker.postMessage({ type, id, ...body } as SandboxRequest);\n });\n\n const subscribe = <T>(listeners: Set<T>, listener: T) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n return {\n load: (source, options) => send<'cargar', Loaded>('cargar', { source, ...(options ? { options } : {}) }),\n run: () => send<'ejecutar', Stopped>('ejecutar'),\n resume: () => send<'continuar', Stopped>('continuar'),\n step: () => send<'paso', Stopped>('paso'),\n pause: () => send<'pausar', void>('pausar'),\n goToStep: step => send<'ir_a_paso', Stopped>('ir_a_paso', { step }),\n provideInput: line => send<'entrada', void>('entrada', { line }),\n closeInput: () => send<'cerrar_entrada', void>('cerrar_entrada'),\n setBreakpoints: lines => send<'puntos_de_interrupción', void>('puntos_de_interrupción', { lines }),\n evaluarReto: (source, challenge) => send<'evaluar_reto', ChallengeResult>('evaluar_reto', { source, challenge }),\n onProgress: listener => {\n const unsubscribe = subscribe(progressListeners, listener);\n return () => void unsubscribe();\n },\n onStopped: listener => {\n const unsubscribe = subscribe(stoppedListeners, listener);\n return () => void unsubscribe();\n },\n terminate: () => {\n worker.terminate?.();\n for (const request of pending.values()) request.reject(new Error('El sandbox se cerró.'));\n pending.clear();\n },\n };\n};\n",
|
|
25
25
|
"import { evaluarReto } from './challenge';\nimport type { Challenge, ChallengeResult } from './challenge';\nimport type { ErrorInfo } from './errors';\nimport { Machine, serialize } from './runtime/machine';\nimport type { MachineEvent, MachineOptions, MachineStatus, SerializedValue, Snapshot } from './runtime/machine';\nimport { compile } from './runtime/compiler';\nimport { parse } from './syntax/parser';\nimport type * as ast from './syntax/ast';\nimport type { Token } from './syntax/token';\nimport { createWorld } from './world';\nimport type { WorldDefinition } from './world';\n\n/**\n * Protocolo del sandbox: los mensajes entre la página y el worker que ejecuta el código. La lógica vive aquí,\n * sin depender de `postMessage`, para poder probarla; `worker.ts` la conecta con el worker y `sandbox.ts` es\n * el cliente tipado para la página.\n */\n\n/** Qué eventos llegan en cada tanda. */\nexport type EventDetail = 'nada' | 'pasos' | 'decisiones' | 'todo';\n\nexport interface SandboxOptions {\n /** Entrada inicial, además de la que se dé con `entrada`. */\n input?: string[];\n /** Si `leer()` sin entrada pausa la ejecución para pedirla. Por defecto `true`. */\n interactiveInput?: boolean;\n /** Semilla de `aleatorio`. Si no se da, se elige una al cargar y se conserva en los retrocesos. */\n seed?: number;\n maxOperations?: number;\n maxCallDepth?: number;\n maxOutput?: number;\n breakpoints?: number[];\n /** Mundo del modo mundo, en el formato de `WorldDefinition`. */\n world?: WorldDefinition;\n /**\n * `pasos`: solo `paso` y `robot`; `decisiones`: además `decide`; `todo`: todos los eventos; `nada`: ninguno.\n * Por defecto `decisiones`.\n */\n detail?: EventDetail;\n /** Operaciones por tanda antes de ceder el control. Por defecto 50 000. */\n batchSize?: number;\n}\n\nexport type SandboxRequest =\n | { type: 'cargar'; id: number; source: string; options?: SandboxOptions }\n /** Ejecuta hasta terminar, sin detenerse en los puntos de interrupción. */\n | { type: 'ejecutar'; id: number }\n /** Ejecuta hasta el siguiente punto de interrupción, o hasta terminar. */\n | { type: 'continuar'; id: number }\n | { type: 'paso'; id: number }\n | { type: 'pausar'; id: number }\n /** Vuelve a ejecutar desde el inicio, con la misma entrada y semilla, hasta el paso `step`. */\n | { type: 'ir_a_paso'; id: number; step: number }\n | { type: 'entrada'; id: number; line: string }\n | { type: 'cerrar_entrada'; id: number }\n | { type: 'puntos_de_interrupción'; id: number; lines: number[] }\n | { type: 'evaluar_reto'; id: number; source: string; challenge: Challenge };\n\nexport type StopReason = 'paso' | 'punto_de_interrupción' | 'pausa' | 'entrada' | 'fin' | 'error' | 'retroceso';\n\nexport interface Loaded {\n type: 'cargado';\n id: number;\n tokens: Token[];\n program: ast.Program;\n /** Errores léxicos y sintácticos. Si hay alguno, no se puede ejecutar. */\n errors: ErrorInfo[];\n /** Semilla de `aleatorio` de esta carga. */\n seed: number;\n}\n\nexport interface Progress {\n type: 'progreso';\n id: number;\n operations: number;\n steps: number;\n /** Salida nueva desde el mensaje anterior. */\n output: string;\n events: MachineEvent[];\n}\n\nexport interface Stopped {\n type: 'detenido';\n id: number;\n status: MachineStatus;\n reason: StopReason;\n operations: number;\n steps: number;\n /** Salida nueva desde el mensaje anterior; con `replaceOutput`, toda la salida. */\n output: string;\n /** En un retroceso, la salida reemplaza a la anterior en lugar de agregarse. */\n replaceOutput?: boolean;\n events: MachineEvent[];\n snapshot: Snapshot;\n result?: SerializedValue;\n error?: ErrorInfo;\n}\n\nexport type SandboxResponse =\n | Loaded\n | Progress\n | Stopped\n | { type: 'hecho'; id: number }\n | { type: 'reto'; id: number; result: ChallengeResult }\n /** El mensaje no se pudo atender (no hay programa cargado, la ejecución sigue en curso…). */\n | { type: 'error'; id: number; message: string };\n\nconst DETAIL: Record<EventDetail, ReadonlySet<MachineEvent['type']> | 'todo'> = {\n nada: new Set(),\n pasos: new Set(['paso', 'robot']),\n decisiones: new Set(['paso', 'robot', 'decide']),\n todo: 'todo',\n};\n\nconst tick = () => new Promise<void>(resolve => setTimeout(resolve, 0));\n\nexport class SandboxHost {\n private program?: ast.Program;\n private options: SandboxOptions = {};\n private seed = 0;\n private machine?: Machine;\n /** Líneas que se le dieron a `leer()` en esta carga, para repetirlas al retroceder. */\n private inputLog: string[] = [];\n private inputClosed = false;\n private events: MachineEvent[] = [];\n private muted = false;\n private sentOutput = 0;\n private running = false;\n private pauseRequested = false;\n\n constructor(private readonly post: (message: SandboxResponse) => void) {}\n\n async handle(request: SandboxRequest): Promise<void> {\n switch (request.type) {\n case 'cargar':\n if (this.running) return this.busy(request.id);\n return this.load(request.id, request.source, request.options ?? {});\n case 'evaluar_reto':\n this.post({ type: 'reto', id: request.id, result: evaluarReto(request.source, request.challenge) });\n return;\n case 'pausar':\n this.pauseRequested = this.running;\n this.post({ type: 'hecho', id: request.id });\n return;\n }\n\n const machine = this.machine;\n if (!machine) {\n this.post({ type: 'error', id: request.id, message: 'No hay un programa cargado sin errores.' });\n return;\n }\n switch (request.type) {\n case 'entrada':\n this.inputLog.push(request.line);\n machine.provideInput(request.line);\n this.post({ type: 'hecho', id: request.id });\n return;\n case 'cerrar_entrada':\n this.inputClosed = true;\n machine.closeInput();\n this.post({ type: 'hecho', id: request.id });\n return;\n case 'puntos_de_interrupción':\n this.options = { ...this.options, breakpoints: request.lines };\n machine.setBreakpoints(request.lines);\n this.post({ type: 'hecho', id: request.id });\n return;\n }\n\n if (this.running) return this.busy(request.id);\n switch (request.type) {\n case 'paso':\n machine.step();\n this.stopped(request.id, machine);\n return;\n case 'ejecutar':\n case 'continuar':\n return this.runInBatches(request.id, machine, request.type === 'ejecutar');\n case 'ir_a_paso':\n this.goToStep(request.id, request.step);\n return;\n }\n }\n\n private busy(id: number): void {\n this.post({ type: 'error', id, message: 'La ejecución sigue en curso; pausa antes de mandar otra orden.' });\n }\n\n private load(id: number, source: string, options: SandboxOptions): void {\n this.options = options;\n this.seed = (options.seed ?? Math.floor(Math.random() * 2 ** 32)) >>> 0;\n this.inputLog = [];\n this.inputClosed = false;\n this.events = [];\n this.sentOutput = 0;\n const { program, tokens, errors } = parse(source);\n this.program = errors.length === 0 ? program : undefined;\n this.machine = this.program ? this.createMachine() : undefined;\n this.post({ type: 'cargado', id, tokens, program, errors: errors.map(error => error.toJSON()), seed: this.seed });\n }\n\n private createMachine(): Machine {\n const { options } = this;\n const levels = DETAIL[options.detail ?? 'decisiones'];\n const machineOptions: MachineOptions = {\n input: options.input ?? [],\n interactiveInput: options.interactiveInput ?? true,\n seed: this.seed,\n breakpoints: options.breakpoints ?? [],\n onEvent: event => {\n if (this.muted) return;\n if (levels === 'todo' || levels.has(event.type)) this.events.push(event);\n },\n ...(options.maxOperations !== undefined ? { maxOperations: options.maxOperations } : {}),\n ...(options.maxCallDepth !== undefined ? { maxCallDepth: options.maxCallDepth } : {}),\n ...(options.maxOutput !== undefined ? { maxOutput: options.maxOutput } : {}),\n ...(options.world ? { world: createWorld(options.world) } : {}),\n };\n return new Machine(compile(this.program!), machineOptions);\n }\n\n private async runInBatches(id: number, machine: Machine, ignoreBreakpoints: boolean): Promise<void> {\n this.running = true;\n this.pauseRequested = false;\n const breakpoints = this.options.breakpoints ?? [];\n if (ignoreBreakpoints) machine.setBreakpoints([]);\n try {\n while (true) {\n const status = machine.run(this.options.batchSize ?? 50_000);\n if (status !== 'pausada' || machine.pauseReason !== 'presupuesto') break;\n if (this.pauseRequested) break;\n this.post({\n type: 'progreso',\n id,\n operations: machine.operations,\n steps: machine.steps,\n output: this.newOutput(machine),\n events: this.takeEvents(),\n });\n // Ceder el control deja que llegue un `pausar`.\n await tick();\n if (this.pauseRequested) break;\n }\n } finally {\n if (ignoreBreakpoints) machine.setBreakpoints(breakpoints);\n this.running = false;\n }\n this.stopped(id, machine, this.pauseRequested && machine.status === 'pausada' ? 'pausa' : undefined);\n this.pauseRequested = false;\n }\n\n private goToStep(id: number, step: number): void {\n // Como la ejecución es determinista, otra máquina con la misma entrada y semilla llega al mismo estado.\n const machine = this.createMachine();\n for (const line of this.inputLog) machine.provideInput(line);\n if (this.inputClosed) machine.closeInput();\n this.muted = true;\n try {\n while (machine.steps < step && !machine.done && machine.status !== 'esperando_entrada') machine.step();\n } finally {\n this.muted = false;\n }\n this.machine = machine;\n this.events = [];\n this.sentOutput = 0;\n this.stopped(id, machine, 'retroceso', true);\n }\n\n private newOutput(machine: Machine): string {\n const output = machine.output;\n const fresh = output.slice(this.sentOutput);\n this.sentOutput = output.length;\n return fresh;\n }\n\n private takeEvents(): MachineEvent[] {\n const events = this.events;\n this.events = [];\n return events;\n }\n\n private stopped(id: number, machine: Machine, reason?: StopReason, replaceOutput = false): void {\n const status = machine.status;\n const finalReason: StopReason =\n reason ??\n (status === 'terminada'\n ? 'fin'\n : status === 'error'\n ? 'error'\n : status === 'esperando_entrada'\n ? 'entrada'\n : machine.pauseReason === 'punto_de_interrupción'\n ? 'punto_de_interrupción'\n : 'paso');\n this.post({\n type: 'detenido',\n id,\n status,\n reason: finalReason,\n operations: machine.operations,\n steps: machine.steps,\n output: this.newOutput(machine),\n ...(replaceOutput ? { replaceOutput: true } : {}),\n events: this.takeEvents(),\n snapshot: machine.snapshot(),\n ...(status === 'terminada' ? { result: serialize(machine.result) } : {}),\n ...(machine.error ? { error: machine.error.toJSON() } : {}),\n });\n }\n}\n"
|
|
26
26
|
],
|
|
27
|
-
"mappings": "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,EACA,uBAAwB,CACtB,KAAM,WACN,YACE,iIACJ,EACA,yBAA0B,CACxB,KAAM,WACN,YACE,8KACJ,EACA,2BAA4B,CAC1B,KAAM,WACN,YACE,oLACJ,EACA,2BAA4B,CAC1B,KAAM,WACN,YACE,gPACJ,EACA,iBAAkB,CAChB,KAAM,WACN,YAAa,8FACf,EACA,mBAAoB,CAClB,KAAM,WACN,YACE,wMACJ,EACA,qBAAsB,CACpB,KAAM,WACN,YACE,uGACJ,EACA,iBAAkB,CAChB,KAAM,WACN,YACE,0KACJ,EACA,oBAAqB,CACnB,KAAM,WACN,YACE,yJACJ,EACA,wBAAyB,CACvB,KAAM,WACN,YACE,sMACJ,EACA,eAAgB,CACd,KAAM,WACN,YAAa,kGACf,EACA,gBAAiB,CACf,KAAM,WACN,YACE,gIACJ,EACA,gBAAiB,CACf,KAAM,WACN,YACE,mOACJ,EACA,oBAAqB,CACnB,KAAM,WACN,YACE,iIACJ,EACA,kBAAmB,CACjB,KAAM,WACN,YACE,sMACJ,EACA,mBAAoB,CAClB,KAAM,WACN,YACE,8IACJ,EACA,yBAA0B,CACxB,KAAM,WACN,YACE,oMACJ,EACA,YAAa,CACX,KAAM,WACN,YACE,2HACJ,EACA,qBAAsB,CACpB,KAAM,WACN,YAAa,wFACf,EACA,sBAAuB,CACrB,KAAM,WACN,YACE,iIACJ,EACA,uBAAwB,CACtB,KAAM,WACN,YACE,2JACJ,EACA,SAAU,CACR,KAAM,WACN,YACE,8GACJ,EACA,eAAgB,CACd,KAAM,WACN,YACE,sKACJ,EACA,aAAc,CACZ,KAAM,WACN,YAAa,2EACf,EAGA,uBAAwB,CACtB,KAAM,YACN,YACE,sJACJ,EACA,iBAAkB,CAChB,KAAM,YACN,YACE,kHACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,yLACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,uGACJ,EACA,WAAY,CACV,KAAM,YACN,YACE,8GACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,0KACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,8NACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,+GACJ,EACA,mCAAoC,CAClC,KAAM,YACN,YACE,8KACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,0GACJ,EACA,6BAA8B,CAC5B,KAAM,YACN,YACE,iNACJ,EACA,YAAa,CACX,KAAM,YACN,YACE,+GACJ,EACA,wBAAyB,CACvB,KAAM,YACN,YACE,uOACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,uKACJ,EACA,cAAe,CACb,KAAM,YACN,YAAa,gGACf,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,4KACJ,EACA,gCAAiC,CAC/B,KAAM,YACN,YACE,qMACJ,EACA,aAAc,CACZ,KAAM,YACN,YACE,mHACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,8KACJ,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,gJACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,0KACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,uKACJ,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,sQACJ,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,6MACJ,EACA,WAAY,CACV,KAAM,YACN,YACE,4GACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,6IACJ,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,sHACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,gIACJ,EACA,gBAAiB,CACf,KAAM,YACN,YACE,oIACJ,EACA,iBAAkB,CAChB,KAAM,YACN,YAAa,6DACf,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,yIACJ,EACA,cAAe,CACb,KAAM,YACN,YAAa,gGACf,EACA,gBAAiB,CACf,KAAM,YACN,YACE,8HACJ,EACA,YAAa,CACX,KAAM,YACN,YACE,mHACJ,EACA,eAAgB,CACd,KAAM,YACN,YAAa,yFACf,EACA,gBAAiB,CACf,KAAM,YACN,YACE,yJACJ,EACA,gBAAiB,CACf,KAAM,YACN,YACE,kLACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,kKACJ,EACA,cAAe,CACb,KAAM,YACN,YACE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",
|
|
28
|
-
"debugId": "
|
|
27
|
+
"mappings": "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V,OAAQ,EACR,QAAS,eAAe,MAAM,yCAAyC,eACzE,CAAC,EAGL,MAAO,CAAE,GAAI,EAAY,SAAW,EAAG,aAAY,GC9f9C,IAAM,GAAkF,CAE7F,qBAAsB,CACpB,KAAM,SACN,YACE,sPACJ,EACA,sBAAuB,CACrB,KAAM,SACN,YACE,2IACJ,EACA,mBAAoB,CAClB,KAAM,SACN,YACE,yMACJ,EACA,0BAA2B,CACzB,KAAM,SACN,YACE,6IACJ,EACA,mBAAoB,CAClB,KAAM,SACN,YACE,+JACJ,EACA,iBAAkB,CAChB,KAAM,SACN,YACE,mLACJ,EAGA,qBAAsB,CACpB,KAAM,WACN,YACE,6KACJ,EACA,oBAAqB,CACnB,KAAM,WACN,YACE,+NACJ,EACA,kBAAmB,CACjB,KAAM,WACN,YACE,8KACJ,EACA,eAAgB,CACd,KAAM,WACN,YACE,uMACJ,EACA,eAAgB,CACd,KAAM,WACN,YACE,2JACJ,EACA,mBAAoB,CAClB,KAAM,WACN,YACE,+MACJ,EACA,uBAAwB,CACtB,KAAM,WACN,YACE,iIACJ,EACA,yBAA0B,CACxB,KAAM,WACN,YACE,8KACJ,EACA,2BAA4B,CAC1B,KAAM,WACN,YACE,oLACJ,EACA,2BAA4B,CAC1B,KAAM,WACN,YACE,gPACJ,EACA,iBAAkB,CAChB,KAAM,WACN,YAAa,8FACf,EACA,mBAAoB,CAClB,KAAM,WACN,YACE,wMACJ,EACA,qBAAsB,CACpB,KAAM,WACN,YACE,uGACJ,EACA,iBAAkB,CAChB,KAAM,WACN,YACE,0KACJ,EACA,oBAAqB,CACnB,KAAM,WACN,YACE,yJACJ,EACA,wBAAyB,CACvB,KAAM,WACN,YACE,sMACJ,EACA,eAAgB,CACd,KAAM,WACN,YAAa,kGACf,EACA,gBAAiB,CACf,KAAM,WACN,YACE,gIACJ,EACA,gBAAiB,CACf,KAAM,WACN,YACE,mOACJ,EACA,oBAAqB,CACnB,KAAM,WACN,YACE,iIACJ,EACA,kBAAmB,CACjB,KAAM,WACN,YACE,sMACJ,EACA,mBAAoB,CAClB,KAAM,WACN,YACE,8IACJ,EACA,yBAA0B,CACxB,KAAM,WACN,YACE,oMACJ,EACA,YAAa,CACX,KAAM,WACN,YACE,2HACJ,EACA,qBAAsB,CACpB,KAAM,WACN,YAAa,wFACf,EACA,sBAAuB,CACrB,KAAM,WACN,YACE,iIACJ,EACA,uBAAwB,CACtB,KAAM,WACN,YACE,2JACJ,EACA,SAAU,CACR,KAAM,WACN,YACE,8GACJ,EACA,eAAgB,CACd,KAAM,WACN,YACE,sKACJ,EACA,aAAc,CACZ,KAAM,WACN,YAAa,2EACf,EAGA,mBAAoB,CAClB,KAAM,YACN,YACE,8SACJ,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,sJACJ,EACA,iBAAkB,CAChB,KAAM,YACN,YACE,kHACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,yLACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,uGACJ,EACA,WAAY,CACV,KAAM,YACN,YACE,8GACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,0KACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,8NACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,+GACJ,EACA,mCAAoC,CAClC,KAAM,YACN,YACE,8KACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,0GACJ,EACA,6BAA8B,CAC5B,KAAM,YACN,YACE,iNACJ,EACA,YAAa,CACX,KAAM,YACN,YACE,+GACJ,EACA,wBAAyB,CACvB,KAAM,YACN,YACE,uOACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,uKACJ,EACA,cAAe,CACb,KAAM,YACN,YAAa,gGACf,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,4KACJ,EACA,gCAAiC,CAC/B,KAAM,YACN,YACE,qMACJ,EACA,aAAc,CACZ,KAAM,YACN,YACE,mHACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,8KACJ,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,gJACJ,EACA,qBAAsB,CACpB,KAAM,YACN,YACE,0KACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,uKACJ,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,sQACJ,EACA,mBAAoB,CAClB,KAAM,YACN,YACE,6MACJ,EACA,WAAY,CACV,KAAM,YACN,YACE,4GACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,6IACJ,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,sHACJ,EACA,eAAgB,CACd,KAAM,YACN,YACE,gIACJ,EACA,gBAAiB,CACf,KAAM,YACN,YACE,oIACJ,EACA,iBAAkB,CAChB,KAAM,YACN,YAAa,6DACf,EACA,uBAAwB,CACtB,KAAM,YACN,YACE,yIACJ,EACA,cAAe,CACb,KAAM,YACN,YAAa,gGACf,EACA,gBAAiB,CACf,KAAM,YACN,YACE,8HACJ,EACA,YAAa,CACX,KAAM,YACN,YACE,mHACJ,EACA,eAAgB,CACd,KAAM,YACN,YAAa,yFACf,EACA,gBAAiB,CACf,KAAM,YACN,YACE,yJACJ,EACA,gBAAiB,CACf,KAAM,YACN,YACE,kLACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,kKACJ,EACA,cAAe,CACb,KAAM,YACN,YACE,2HACJ,EACA,iBAAkB,CAChB,KAAM,YACN,YACE,qOACJ,EACA,sBAAuB,CACrB,KAAM,YACN,YACE,oIACJ,EACA,kBAAmB,CACjB,KAAM,YACN,YACE,+JACJ,EACA,sBAAuB,CACrB,KAAM,YACN,YACE,8KACJ,EACA,gBAAiB,CACf,KAAM,YACN,YACE,6GACJ,EACA,oBAAqB,CACnB,KAAM,YACN,YACE,yHACJ,EAGA,oBAAqB,CACnB,KAAM,SACN,YACE,wJACJ,EACA,uBAAwB,CACtB,KAAM,SACN,YACE,iKACJ,EACA,iBAAkB,CAChB,KAAM,SACN,YACE,yGACJ,CACF,ECpXA,IAAM,GAAyD,CAC5D,IAAgB,cAChB,MAAkB,cAClB,OAAmB,cACnB,SAAqB,cACrB,OAAmB,cACnB,GAAe,UACf,OAAmB,UACnB,KAAiB,UACjB,MAAkB,UAClB,GAAe,UACf,MAAkB,UAClB,IAAgB,UAChB,SAAqB,UACrB,KAAiB,UACjB,GAAe,UACf,KAAiB,UACjB,GAAe,UACf,OAAmB,UACnB,M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",
|
|
28
|
+
"debugId": "743C8838CD39F9B564756E2164756E21",
|
|
29
29
|
"names": []
|
|
30
30
|
}
|