You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Grading] Team: Ronald Cabrera , Josue J. Senarega , Jery Rodríguez, Alex Moreno #30
Rust 2021, pipeline de 4 fases, backend por transpilación a C.lexer → parser → semantic → codegen, orquestado por src/main.rs (129 LOC) con priority gating de exit codes 1/2/3 (léxico/sintáctico/semántico) y 0 para éxito. Unas ~13 460 LOC propias con solo tres dependencias de propósito acotado: logos (DFA compilado en build-time), thiserror (errores ergonómicos) e indexmap (mapas ordenados). La decisión arquitectónica distintiva es emitir código C desde el AST tipado y delegar en el cc del sistema (probando cc, gcc, clang en ese orden) para producir ./output (src/main.rs:80-104). Reutiliza la toolchain de C — aritmética, dispatch por punteros a función, optimización -O2 — a costa de exigir un compilador de C presente. Runtime de valores etiquetados con Value = { tag; num; str; b; obj; vec } (unión discriminada gorda, codegen.rs:826) y tags TAG_NUM/STR/BOOL/OBJ/VEC (líneas 818-822). Objetos son struct { int type_id; Value* fields; } con slots de atributo/método globales compartidos entre todos los tipos (Codegen::new líneas 73-80) y vtables como vtables[type_id][method_slot] (líneas 112-113, init_tables líneas 156-177) resueltas subiendo por la cadena de herencia con resolve_method. Los tres slots del protocolo iterador (next, current, iter) se reservan primero para que gen_iter_loop pueda probar cualquier vtable en esas posiciones uniformemente. El runtime C inline (RUNTIME_PREAMBLE, ~100 líneas, líneas 813-910+) provee hulk_add/hulk_concat/hulk_eq/hulk_print + primitivas de vector. Deliberadamente sin GC (malloc-and-leak, documentado en REPORT.md §8.7) y sin bounds-checking en vec_index — decisiones pragmáticas coherentes con la elección de transpilar a C.
Resultados de Tests
71/71 obligatorios + 10/10 extras pasan según CI 2026-06-24.
ok/lambdas (6 tests): sin variante Lambda en Expr, sin rama en parse_primary, sin machinery de closures en codegen.
ok/macros (8 tests): sin token define/macro, sin regla de parser, sin nodo AST; la única mención de "macros" en el código fuente es un residuo de plantilla en un docstring (checker.rs:1317).
Categorías errors/syntactic relacionadas con lambdas/macros: fallan por la misma razón — el parser genuinamente no reconoce estas construcciones.
Lo que el Compilador Implementa
Lexer con logos (src/lexer/lexer.rs, 447 LOC): todas las palabras clave (let, if, while, for, function, type, new, inherits, is, as, base, protocol, extends), operadores compuestos (+=, -=, *=, /=, %=, ^=, @=) declarados como tokens propios, y un alias interface = protocol (líneas 140-142) que permite compatibilidad con tests del evaluador. LineIndex traduce byte-offsets a (línea, columna) 1-based en O(log n); errores léxicos se acumulan en TokenStream::errors sin abortar el escaneo, y main.rs los enumera todos antes de salir.
Parser recursivo descendente escrito a mano (src/parser/parser.rs, 1992 LOC) con escalada de precedencia bien definida: parse_expr → parse_assign → parse_or → parse_and → parse_not → parse_cmp → parse_cat → parse_add → parse_mul → parse_power → parse_unary → parse_postfix → parse_primary. Compound assignment desazucarado en el parser (líneas 286-309): lhs OP= rhs produce un AST Assign { target, value: BinaryOp { op, left, right } } sin tocar semántica ni codegen. Interpolación de cadenas también desazucarada en parser (build_interpolation, líneas 1069-1131): re-invoca un Parser anidado sobre el fragmento ${...} y compone concatenaciones @. Doble sintaxis de vectores: [e, e, ...], {e, e, ...}, comprensión [body | var in iterable], y new T[n]{ i -> body } con inicializador acotado. Recuperación panic-mode con puntos de sincronización explícitos y nodo Expr::Error como placeholder.
Semántica en dos pasadas (src/semantic/checker.rs, 2290 LOC): predeclaración de nombres para forward references, luego chequeo completo. Sistema SimpleType con 5 variantes (Number, String, Boolean, Named(String), Vector(Box<T>)). Los iterables T* se representan como Vector<T> con una regla de conformidad estructural: un tipo con current(): U conforma a T* si U ≤ T (context.rs:601-609). LCA (context.rs:618-642) une ramas de if/elif/else subiendo por la cadena de padres. Síntesis de protocolos A.9.5 (checker.rs:84-111): un parámetro sin anotar usado como receptor genera un protocolo __SynthN con los métodos requeridos. Overriding con firma exacta — más estricto que varianza tradicional, pero HULK así lo pide. Protocolos builtin Iterable y Enumerable, tipos builtin Number/String/Boolean/Object, funciones builtin (print, sqrt, sin, cos, exp, log, rand, range), constantes builtin (PI, E, ()).
Codegen (src/codegen.rs, 911 LOC): dispatch dinámico uniforme por vtable global; x is T para tipos de usuario camina la cadena parent_id[id] con hulk_is; x as T es identidad en runtime (validez estática ya garantizada); base(args) invoca directamente hulk_m_<parent>_<method> sin pasar por vtable. gen_iter_loop unifica tres casos: range(a, b) se baja a for puro en C sin objeto iterador; vectores se iteran por índice; objetos con protocolo iterador llaman a next/current por vtable, con fallback Enumerable → Iterable vía iter(). Sobrecarga de operadores se despacha por-runtime cuando existe un método candidato en algún tipo (gen_binop, líneas 745-782): (a.tag == TAG_OBJ) ? vtables[a.obj->type_id][SLOT_plus](a, argb) : hulk_add(a, b). Los números/strings preservan fast-path builtin.
Discrepancias entre Reporte y Código
REPORT.md (808 líneas, sustancial) es notablemente fiel al código. Las discrepancias encontradas son menores:
El reporte menciona indexmap como dependencia relevante para determinismo (§2), pero codegen.rs importa std::collections::HashMap, no indexmap::IndexMap. El determinismo real no depende del tipo de mapa — los slots se asignan por número al insertar.
El reporte cita "397 tests unitarios" (§11) — no verifiqué el número exacto, pero los ficheros lexer/test.rs (1858 LOC), parser/tests.rs (781 LOC) y semantic/tests.rs (2741 LOC) suman una batería sustancial y comparable.
El reporte afirma "sin coste para código puramente numérico" en operator overloading (§9.5) — es aproximado: el branch tag == TAG_OBJ existe estáticamente aunque el CPU lo prediga bien.
El resto del reporte se verifica en el código: la síntesis de protocolos A.9.5, la conformidad iterable estructural, el LCA para if/else, la restricción de firma exacta en overriding, el layout de slots globales, la ausencia de GC, la ausencia de bounds-checking. Sin discrepancias significativas.
Features Opcionales
Feature (§ manual)
Marcado
AST
Semántica
Codegen
CI
Núcleo A.1-A.7 (ok/minimal)
✔️
✔️
✔️
✔️
20/20
Tipado A.8 (ok/types)
✔️
✔️
✔️
✔️
10/10
Herencia + is/as (ok/oop)
✔️
✔️
✔️
✔️
10/10
Iterables A.11
✔️
✔️
✔️
✔️
✔️
Vectores A.12
✔️
✔️
✔️
✔️
✔️
Protocolos A.10
✔️
✔️
✔️
✔️ (borrados en runtime)
✔️
Inferencia A.9 (LCA + síntesis A.9.5)
implícito
✔️
✔️
✔️
✔️
Sobrecarga de operadores (extensión)
extensión
✔️
✔️
✔️
ejemplos
Asignación compuesta (extensión)
extensión
✔️ (desazúcar)
—
—
ejemplos
Interpolación de cadenas (extensión)
extensión
✔️ (desazúcar)
—
—
ejemplos
Lambdas / Functors A.13
✗
✗
✗
✗
0/6 fail
Macros A.14
✗
✗
✗
✗
0/8 fail
Extensiones declaradas y verificadas end-to-end en examples/: operator_overloading.hulk, compound_assignment.hulk, string_interpolation.hulk, inference_protocols.hulk, vectors.hulk. Cada uno lleva la salida esperada anotada como comentario inline.
Diagnóstico de Fallas Principales
Las 2 categorías de fallas (macros, lambdas) son 100% atribuibles a features NO marcadas por el equipo en el issue #30. No hay ninguna funcionalidad prometida que esté rota.
Lambdas A.13 (6 tests fallando): búsqueda exhaustiva confirma ausencia total. Expr en src/parser/ast.rs no declara variante Lambda ni función-como-valor; parse_primary no tiene rama para lambda/\/palabra clave equivalente; el único uso "lambda-ish" es el inicializador acotado new T[n]{ i -> body }, que es una forma cerrada solo válida en esa posición sintáctica — no un valor de primera clase. El codegen naturalmente carece de machinery de closures y ambientes capturados.
Macros A.14 (8 tests fallando): ausencia total. Sin token define/macro en el lexer, sin regla en el parser, sin nodo AST. La única mención de "macros" en el código fuente es un residuo de plantilla en un docstring (checker.rs:1317, "Validate a call to an identifier: variables, functions, macros or builtins").
El equipo declara explícitamente en el issue #30 y en REPORT.md §9/§12 la no-implementación de estas dos categorías. La calificación es congruente: no se pierden puntos por features no marcados. Costo aproximado de fix (no requerido):
Lambdas: ~600-1000 LOC — variante AST, tipo función en SimpleType, o desazucarado a clase con apply, codegen con captura.
Macros: ~250-400 LOC — token + regla + fase de expansión sintáctica pre-semántica.
Conclusión
Compilador completo, técnicamente sólido y arquitectónicamente coherente. La transpilación a C con Value etiquetado + slots globales + vtables por type_id × method_slot es una decisión con muy pocas piezas en fricción entre sí: el mismo dispatch dinámico soporta métodos, iteradores y operadores sobrecargados; el mismo runtime de vectores soporta las dos sintaxis (Matcom {...} y documentación [...]); el mismo desazúcar sintáctico habilita compound assignment e interpolación de cadenas. Las extensiones sobre el manual (síntesis de protocolos A.9.5, conformidad iterable estructural, sobrecarga de operadores por convención de nombres, compound assignment, interpolación) están cuidadosamente implementadas sin tocar el modelo runtime donde no hace falta. REPORT.md (808 líneas) es honesto y verificable — describe con precisión lo implementado, marca sus límites (sin GC, sin bounds-check, sin lambdas ni macros), y justifica las decisiones. Todas las fallas de test corresponden exactamente a features no marcadas por el equipo (macros A.14, lambdas A.13); nada roto en lo prometido. HULKForge se distingue en el curso por la disciplina de reutilizar mecanismos y por elegir la simplicidad del modelo (transpilación a C, tagged Value, slots globales) sobre el barroquismo de una IR/VM propia. Trabajo destacable con muy buena coherencia interna.
Revisado. La §11 es exactamente lo que faltaba: critica HULK como lenguaje, cada defecto con su sección del manual y una comparación concreta, y cierra con una tesis propia. LP sube a 5. Notas finales: CMP 5 / LP 5.
Activity
github-actions commentedon Jun 15, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 15, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 15, 2026
🤖 HULK Grading Report — 2026-06-15 02:02 UTC
📦 Build
❌ Build failed
github-actions commentedon Jun 15, 2026
🤖 HULK Grading Report — 2026-06-15 02:03 UTC
📦 Build
❌ Build failed
ronaldcbmtnz commentedon Jun 15, 2026
/regrade
github-actions commentedon Jun 15, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 15, 2026
🤖 HULK Grading Report — 2026-06-15 02:20 UTC
📦 Build
❌ Build failed
ronaldcbmtnz commentedon Jun 15, 2026
/regrade
github-actions commentedon Jun 15, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 15, 2026
🤖 HULK Grading Report — 2026-06-15 02:43 UTC
📦 Build
❌ Build failed
ronaldcbmtnz commentedon Jun 15, 2026
/regrade
github-actions commentedon Jun 15, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 15, 2026
🤖 HULK Grading Report — 2026-06-15 03:29 UTC
📦 Build
✅ Build successful
📄 Report
❌
REPORT.mdnot found in repo root.🧪 Tests
ok/minimalok/typesok/ooperrors/lexicalerrors/syntacticerrors/semanticok/extras❌ Failures
ok/extras/for_complex: expected [ok|ok|ok|] got [fail|fail|ok|]ok/extras/for_even_count: expected [ok|] got [fail|]ok/extras/for_function: expected [ok|] got [fail|]ok/extras/for_let_body: expected [ok|] got [fail|]ok/extras/for_loop: expected [ok|] got [fail|]ok/extras/for_nested: expected [ok|] got [fail|]ok/extras/range_count: expected [ok|] got [fail|]ok/extras/range_sum: expected [ok|ok|] got [fail|fail|]ok/macros/define_block: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_chain: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_conditional: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_hygiene: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_loop: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_nested: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_recursive_expand: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/simple_define: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/arrays/array_2d: compilation failed (exit 2): (1,21) SYNTACTIC: expected '=' in let bindingok/arrays/array_auto_init: compilation failed (exit 2): (1,29) SYNTACTIC: expected '('ok/arrays/array_basic: compilation failed (exit 2): (1,29) SYNTACTIC: expected '('ok/arrays/array_literal: compilation failed (exit 2): (1,22) SYNTACTIC: expected ';' or '}' after block expression🔖 Status
❌ Not ready for review (
REPORT.mdis missing or too short).Fix the issues above and comment
/regradeto re-run.ronaldcbmtnz commentedon Jun 15, 2026
/regrade
9 remaining items
github-actions commentedon Jun 16, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 16, 2026
🤖 HULK Grading Report — 2026-06-16 00:48 UTC
📦 Build
✅ Build successful
📄 Report
❌
REPORT.mdnot found in repo root.🧪 Tests
ok/minimalok/typesok/ooperrors/lexicalerrors/syntacticerrors/semanticok/extras❌ Failures
ok/macros/define_block: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_chain: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_conditional: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_hygiene: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_loop: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_nested: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_recursive_expand: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/simple_define: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/arrays/array_2d: compilation failed (exit 2): (1,21) SYNTACTIC: expected '=' in let bindingok/arrays/array_auto_init: compilation failed (exit 2): (1,29) SYNTACTIC: expected '('ok/arrays/array_basic: compilation failed (exit 2): (1,29) SYNTACTIC: expected '('ok/arrays/array_literal: compilation failed (exit 2): (1,22) SYNTACTIC: expected ';' or '}' after block expressionok/arrays/array_mutation: compilation failed (exit 2): (1,31) SYNTACTIC: expected '('ok/arrays/array_pass: compilation failed (exit 2): (4,31) SYNTACTIC: expected ';' or '}' after block expressionok/arrays/array_size: compilation failed (exit 2): (2,33) SYNTACTIC: expected '('ok/arrays/array_sum: compilation failed (exit 2): (1,29) SYNTACTIC: expected '('ok/lambdas/lambda_as_arg: compilation failed (exit 2): (1,19) SYNTACTIC: expected type expressionok/lambdas/lambda_basic: compilation failed (exit 2): (1,8) SYNTACTIC: expected type expressionok/lambdas/lambda_closure: compilation failed (exit 2): (2,15) SYNTACTIC: expected type expressionok/lambdas/lambda_compose: compilation failed (exit 2): (1,21) SYNTACTIC: expected type expression🔖 Status
❌ Not ready for review (
REPORT.mdis missing or too short).Fix the issues above and comment
/regradeto re-run.ronaldcbmtnz commentedon Jun 16, 2026
/regrade
github-actions commentedon Jun 16, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchsemantic...github-actions commentedon Jun 16, 2026
🤖 HULK Grading Report — 2026-06-16 15:24 UTC
📦 Build
✅ Build successful
📄 Report
❌
REPORT.mdnot found in repo root.🧪 Tests
ok/minimalok/typesok/ooperrors/lexicalerrors/syntacticerrors/semanticok/extras❌ Failures
ok/macros/define_block: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_chain: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_conditional: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_hygiene: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_loop: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_nested: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_recursive_expand: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/simple_define: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/lambdas/lambda_as_arg: compilation failed (exit 2): (1,19) SYNTACTIC: expected type expressionok/lambdas/lambda_basic: compilation failed (exit 2): (1,8) SYNTACTIC: expected type expressionok/lambdas/lambda_closure: compilation failed (exit 2): (2,15) SYNTACTIC: expected type expressionok/lambdas/lambda_compose: compilation failed (exit 2): (1,21) SYNTACTIC: expected type expressionok/lambdas/lambda_higher_order: compilation failed (exit 2): (1,47) SYNTACTIC: expected type expressionok/lambdas/lambda_make_adder: compilation failed (exit 2): (1,33) SYNTACTIC: expected type expression🔖 Status
❌ Not ready for review (
REPORT.mdis missing or too short).Fix the issues above and comment
/regradeto re-run.ronaldcbmtnz commentedon Jun 18, 2026
/regrade
github-actions commentedon Jun 18, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchmain...github-actions commentedon Jun 18, 2026
🤖 HULK Grading Report — 2026-06-18 00:13 UTC
📦 Build
✅ Build successful
📄 Report
✅
REPORT.mdfound (6,689 words)🧪 Tests
ok/minimalok/typesok/ooperrors/lexicalerrors/syntacticerrors/semanticok/extras❌ Failures
ok/macros/define_block: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_chain: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_conditional: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_hygiene: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_loop: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_nested: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_recursive_expand: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/simple_define: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/lambdas/lambda_as_arg: compilation failed (exit 2): (1,19) SYNTACTIC: expected type expressionok/lambdas/lambda_basic: compilation failed (exit 2): (1,8) SYNTACTIC: expected type expressionok/lambdas/lambda_closure: compilation failed (exit 2): (2,15) SYNTACTIC: expected type expressionok/lambdas/lambda_compose: compilation failed (exit 2): (1,21) SYNTACTIC: expected type expressionok/lambdas/lambda_higher_order: compilation failed (exit 2): (1,47) SYNTACTIC: expected type expressionok/lambdas/lambda_make_adder: compilation failed (exit 2): (1,33) SYNTACTIC: expected type expression🔖 Status
✅ Ready for review. All required tests pass and
REPORT.mdis present.ronaldcbmtnz commentedon Jun 24, 2026
/regrade
github-actions commentedon Jun 24, 2026
⏳ HULK Grading running on
https://github.com/JosuSC/HULKForge.git@ branchmain...github-actions commentedon Jun 24, 2026
🤖 HULK Grading Report — 2026-06-24 19:47 UTC
📦 Build
✅ Build successful
📄 Report
✅
REPORT.mdfound (6,702 words)🧪 Tests
ok/minimalok/typesok/ooperrors/lexicalerrors/syntacticerrors/semanticok/extras❌ Failures
ok/macros/define_block: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_chain: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_conditional: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_hygiene: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_loop: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_nested: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/define_recursive_expand: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/macros/simple_define: compilation failed (exit 2): (1,8) SYNTACTIC: unexpected tokens after global expressionok/lambdas/lambda_as_arg: compilation failed (exit 2): (1,19) SYNTACTIC: expected type expressionok/lambdas/lambda_basic: compilation failed (exit 2): (1,8) SYNTACTIC: expected type expressionok/lambdas/lambda_closure: compilation failed (exit 2): (2,15) SYNTACTIC: expected type expressionok/lambdas/lambda_compose: compilation failed (exit 2): (1,21) SYNTACTIC: expected type expressionok/lambdas/lambda_higher_order: compilation failed (exit 2): (1,47) SYNTACTIC: expected type expressionok/lambdas/lambda_make_adder: compilation failed (exit 2): (1,33) SYNTACTIC: expected type expression🔖 Status
✅ Ready for review. All required tests pass and
REPORT.mdis present.apiad commentedon Jul 2, 2026
🔍 Evaluación Automática — Claude Code
Arquitectura del Compilador
Rust 2021, pipeline de 4 fases, backend por transpilación a C.
lexer → parser → semantic → codegen, orquestado porsrc/main.rs(129 LOC) con priority gating de exit codes 1/2/3 (léxico/sintáctico/semántico) y 0 para éxito. Unas ~13 460 LOC propias con solo tres dependencias de propósito acotado:logos(DFA compilado en build-time),thiserror(errores ergonómicos) eindexmap(mapas ordenados). La decisión arquitectónica distintiva es emitir código C desde el AST tipado y delegar en elccdel sistema (probandocc,gcc,clangen ese orden) para producir./output(src/main.rs:80-104). Reutiliza la toolchain de C — aritmética, dispatch por punteros a función, optimización-O2— a costa de exigir un compilador de C presente. Runtime de valores etiquetados conValue = { tag; num; str; b; obj; vec }(unión discriminada gorda,codegen.rs:826) y tagsTAG_NUM/STR/BOOL/OBJ/VEC(líneas 818-822). Objetos sonstruct { int type_id; Value* fields; }con slots de atributo/método globales compartidos entre todos los tipos (Codegen::newlíneas 73-80) y vtables comovtables[type_id][method_slot](líneas 112-113,init_tableslíneas 156-177) resueltas subiendo por la cadena de herencia conresolve_method. Los tres slots del protocolo iterador (next,current,iter) se reservan primero para quegen_iter_looppueda probar cualquier vtable en esas posiciones uniformemente. El runtime C inline (RUNTIME_PREAMBLE, ~100 líneas, líneas 813-910+) proveehulk_add/hulk_concat/hulk_eq/hulk_print+ primitivas de vector. Deliberadamente sin GC (malloc-and-leak, documentado enREPORT.md§8.7) y sin bounds-checking envec_index— decisiones pragmáticas coherentes con la elección de transpilar a C.Resultados de Tests
ok/lambdas(6 tests): sin varianteLambdaenExpr, sin rama enparse_primary, sin machinery de closures en codegen.ok/macros(8 tests): sin tokendefine/macro, sin regla de parser, sin nodo AST; la única mención de "macros" en el código fuente es un residuo de plantilla en un docstring (checker.rs:1317).errors/syntacticrelacionadas con lambdas/macros: fallan por la misma razón — el parser genuinamente no reconoce estas construcciones.Lo que el Compilador Implementa
Lexer con
logos(src/lexer/lexer.rs, 447 LOC): todas las palabras clave (let,if,while,for,function,type,new,inherits,is,as,base,protocol,extends), operadores compuestos (+=,-=,*=,/=,%=,^=,@=) declarados como tokens propios, y un aliasinterface=protocol(líneas 140-142) que permite compatibilidad con tests del evaluador.LineIndextraduce byte-offsets a(línea, columna)1-based en O(log n); errores léxicos se acumulan enTokenStream::errorssin abortar el escaneo, ymain.rslos enumera todos antes de salir.Parser recursivo descendente escrito a mano (
src/parser/parser.rs, 1992 LOC) con escalada de precedencia bien definida:parse_expr → parse_assign → parse_or → parse_and → parse_not → parse_cmp → parse_cat → parse_add → parse_mul → parse_power → parse_unary → parse_postfix → parse_primary. Compound assignment desazucarado en el parser (líneas 286-309):lhs OP= rhsproduce un ASTAssign { target, value: BinaryOp { op, left, right } }sin tocar semántica ni codegen. Interpolación de cadenas también desazucarada en parser (build_interpolation, líneas 1069-1131): re-invoca unParseranidado sobre el fragmento${...}y compone concatenaciones@. Doble sintaxis de vectores:[e, e, ...],{e, e, ...}, comprensión[body | var in iterable], ynew T[n]{ i -> body }con inicializador acotado. Recuperación panic-mode con puntos de sincronización explícitos y nodoExpr::Errorcomo placeholder.Semántica en dos pasadas (
src/semantic/checker.rs, 2290 LOC): predeclaración de nombres para forward references, luego chequeo completo. SistemaSimpleTypecon 5 variantes (Number,String,Boolean,Named(String),Vector(Box<T>)). Los iterablesT*se representan comoVector<T>con una regla de conformidad estructural: un tipo concurrent(): Uconforma aT*siU ≤ T(context.rs:601-609). LCA (context.rs:618-642) une ramas deif/elif/elsesubiendo por la cadena de padres. Síntesis de protocolos A.9.5 (checker.rs:84-111): un parámetro sin anotar usado como receptor genera un protocolo__SynthNcon los métodos requeridos. Overriding con firma exacta — más estricto que varianza tradicional, pero HULK así lo pide. Protocolos builtinIterableyEnumerable, tipos builtinNumber/String/Boolean/Object, funciones builtin (print,sqrt,sin,cos,exp,log,rand,range), constantes builtin (PI,E,()).Codegen (
src/codegen.rs, 911 LOC): dispatch dinámico uniforme por vtable global;x is Tpara tipos de usuario camina la cadenaparent_id[id]conhulk_is;x as Tes identidad en runtime (validez estática ya garantizada);base(args)invoca directamentehulk_m_<parent>_<method>sin pasar por vtable.gen_iter_loopunifica tres casos:range(a, b)se baja aforpuro en C sin objeto iterador; vectores se iteran por índice; objetos con protocolo iterador llaman anext/currentpor vtable, con fallbackEnumerable → Iterablevíaiter(). Sobrecarga de operadores se despacha por-runtime cuando existe un método candidato en algún tipo (gen_binop, líneas 745-782):(a.tag == TAG_OBJ) ? vtables[a.obj->type_id][SLOT_plus](a, argb) : hulk_add(a, b). Los números/strings preservan fast-path builtin.Discrepancias entre Reporte y Código
REPORT.md(808 líneas, sustancial) es notablemente fiel al código. Las discrepancias encontradas son menores:indexmapcomo dependencia relevante para determinismo (§2), perocodegen.rsimportastd::collections::HashMap, noindexmap::IndexMap. El determinismo real no depende del tipo de mapa — los slots se asignan por número al insertar.lexer/test.rs(1858 LOC),parser/tests.rs(781 LOC) ysemantic/tests.rs(2741 LOC) suman una batería sustancial y comparable.tag == TAG_OBJexiste estáticamente aunque el CPU lo prediga bien.El resto del reporte se verifica en el código: la síntesis de protocolos A.9.5, la conformidad iterable estructural, el LCA para
if/else, la restricción de firma exacta en overriding, el layout de slots globales, la ausencia de GC, la ausencia de bounds-checking. Sin discrepancias significativas.Features Opcionales
ok/minimal)ok/types)is/as(ok/oop)Extensiones declaradas y verificadas end-to-end en
examples/:operator_overloading.hulk,compound_assignment.hulk,string_interpolation.hulk,inference_protocols.hulk,vectors.hulk. Cada uno lleva la salida esperada anotada como comentario inline.Diagnóstico de Fallas Principales
Las 2 categorías de fallas (macros, lambdas) son 100% atribuibles a features NO marcadas por el equipo en el issue #30. No hay ninguna funcionalidad prometida que esté rota.
Exprensrc/parser/ast.rsno declara varianteLambdani función-como-valor;parse_primaryno tiene rama paralambda/\/palabra clave equivalente; el único uso "lambda-ish" es el inicializador acotadonew T[n]{ i -> body }, que es una forma cerrada solo válida en esa posición sintáctica — no un valor de primera clase. El codegen naturalmente carece de machinery de closures y ambientes capturados.define/macroen el lexer, sin regla en el parser, sin nodo AST. La única mención de "macros" en el código fuente es un residuo de plantilla en un docstring (checker.rs:1317, "Validate a call to an identifier: variables, functions, macros or builtins").El equipo declara explícitamente en el issue #30 y en
REPORT.md§9/§12 la no-implementación de estas dos categorías. La calificación es congruente: no se pierden puntos por features no marcados. Costo aproximado de fix (no requerido):SimpleType, o desazucarado a clase conapply, codegen con captura.Conclusión
Compilador completo, técnicamente sólido y arquitectónicamente coherente. La transpilación a C con
Valueetiquetado + slots globales + vtables portype_id×method_slotes una decisión con muy pocas piezas en fricción entre sí: el mismo dispatch dinámico soporta métodos, iteradores y operadores sobrecargados; el mismo runtime de vectores soporta las dos sintaxis (Matcom{...}y documentación[...]); el mismo desazúcar sintáctico habilita compound assignment e interpolación de cadenas. Las extensiones sobre el manual (síntesis de protocolos A.9.5, conformidad iterable estructural, sobrecarga de operadores por convención de nombres, compound assignment, interpolación) están cuidadosamente implementadas sin tocar el modelo runtime donde no hace falta.REPORT.md(808 líneas) es honesto y verificable — describe con precisión lo implementado, marca sus límites (sin GC, sin bounds-check, sin lambdas ni macros), y justifica las decisiones. Todas las fallas de test corresponden exactamente a features no marcadas por el equipo (macros A.14, lambdas A.13); nada roto en lo prometido. HULKForge se distingue en el curso por la disciplina de reutilizar mecanismos y por elegir la simplicidad del modelo (transpilación a C, taggedValue, slots globales) sobre el barroquismo de una IR/VM propia. Trabajo destacable con muy buena coherencia interna.docs(grading): add report for #30 JosuSC/HULKForge
ronaldcbmtnz commentedon Sep 14, 2026
Buenas profe @apiad , nuestro equipo desea la revisión de LP . Saludos .
apiad commentedon Sep 15, 2026
Revisado. La §11 es exactamente lo que faltaba: critica HULK como lenguaje, cada defecto con su sección del manual y una comparación concreta, y cierra con una tesis propia. LP sube a 5. Notas finales: CMP 5 / LP 5.