HoopLang Docs
/
Playground
Referencia del lenguaje

Diagnósticos

El compilador de HoopLang informa los problemas como diagnósticos: un código, una gravedad, una posición (línea y columna) y un mensaje en inglés. Los errores (E0xx) impiden compilar; las advertencias (W0xx) dejan compilar e informan. Este capítulo describe el formato de salida, cómo se informan los problemas de otros archivos y, para cada código que emite el compilador, sus mensajes, cuándo se producen, un ejemplo verificado y cómo corregirlo.

Códigos que existen hoy: E000, E001, E002, E003, E004, E006, E007, W001, W003, W004, W006, W007, W008, W009 y W010. Los números que faltan (E005, W002, W005) no los emite el compilador actual.

Formato#

Cada diagnóstico se imprime en una línea:

Salida del compilador
<archivo>:<línea>:<columna>: <error|warning> <CÓDIGO>: <mensaje>
Terminal
e003.hoop:4:3: error E003: undeclared thread `negor`; did you mean `negro`?
w001.hoop:4:16: warning W001: shape of 1.00 mm²: under 1.5 mm² does not sew cleanly
  • Líneas y columnas empiezan en 1. La columna cuenta caracteres.
  • El prefijo <archivo>: lo agrega la herramienta (hoop check, hoop build); el diagnóstico en sí es línea:columna: gravedad CÓDIGO: mensaje.
  • Un diagnóstico que no corresponde a una línea usa la posición 1:1 (por ejemplo missing design (or hoop) declaration). Los del hoop entero (the hoop is missing frame, the hoop places no designs) van en la línea de su declaración.
  • Los mensajes sugieren el nombre correcto cuando hay uno parecido (distancia de edición de a lo más un tercio de su largo, o de 2 en los nombres cortos, contando una trasposición como un solo cambio) o cuando es un nombre anterior de una fuente (ArialNegrita → ArialBold): …; did you mean negro?. Si no hay uno parecido, muchos mensajes listan los valores válidos entre paréntesis.
  • En la API (WASM y Rust) cada diagnóstico es una estructura con code, severity ("Error" o "Warning"), pos (line, col) y msg.

Cuántos se informan#

  • Un error léxico o de sintaxis (E000, y el E001 de unidad desconocida, que detecta el analizador léxico) detiene el análisis: se informa sólo ese.
  • Los errores de tipos, nombres y reglas se juntan todos en una pasada.
  • Un mismo diagnóstico en el mismo lugar se informa una vez (por ejemplo, un error dentro de un for de 100 vueltas).
  • Las dos ramas de un if se verifican; sus errores se informan aunque la rama no se borde.
  • Si una declaración falla (shape s = … con un error), usar s después no repite el error; tampoco un frame desconocido arrastra errores por cada place.
  • Los límites (E006 del lienzo, W008, W009) y W007 dependen de la geometría compilada: se revisan sólo si la verificación no encontró errores.

Diagnósticos de otros archivos#

Un problema dentro de un archivo importado (import) o colocado (place) se informa en la línea del import o del place, con el código original, y el mensaje lleva el archivo y la posición dentro de él:

Salida del compilador
in `<archivo>` <línea>:<columna>: <error|warning>: <mensaje original>
Terminal
h_noparam.hoop:4:3: error E001: in `parche.hoop` 1:1: error: `nombre` is String but it was given Length

Con varios niveles, los prefijos se encadenan, del más externo al más interno:

Terminal
imp_lib.hoop:2:1: error E007: in `lib/ca.hoop` 1:1: error: in `lib/cb.hoop` 1:1: error: import cycle: lib/ca.hoop → lib/cb.hoop → lib/ca.hoop

El nombre de archivo es el que se escribió en el import o place. El playground muestra estos diagnósticos también en el archivo de origen, en su línea.

Errores#

E000 — sintaxis#

El texto no se puede analizar: un carácter, número, color o cadena mal escrito, o una construcción que no corresponde.

MensajeCausa
unexpected character c``Un carácter que no pertenece al lenguaje.
unclosed string (missing closing quote)Falta la comilla de cierre (en la misma línea).
unclosed /* commentFalta */.
invalid number: …Un número mal formado.
a color is written #rrggbb (6 hex digits)Un color sin seis dígitos hexadecimales.
`x` is not a declaration (import, design, hoop, thread, const, shape or layer)Una palabra desconocida en el nivel superior.
`x` is not a primitive (fill, satin, run, triple or text)Una palabra desconocida en una capa.
`x` does not belong in a path (from, line, curve or close)Un segmento de path desconocido.
expected …Falta un elemento: `:` after the property name, `at (x, y)`, `from "file"`, `in` (for x in 0..4, or for x in [a, b]), `}`, a value, the thread color (#rrggbb), …
an if that gives a value needs else: if c { a } else { b }Un if usado como valor sin else.
import { … } needs at least one nameUna selección vacía.
importing everything mixes names: …La forma eliminada import "archivo".
a hoop only places designs (move `fill` into a design file)Una primitiva (o seq, inside, layer) directamente en un hoop.
`seq` is not allowed inside `seq` (…), `place` is not allowed inside `seq` (…)Lo que no puede ir en un seq (sí pueden for, if e inside).
HoopLang
// error E000
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c16
Terminal
e000a.hoop:2:16: error E000: a color is written #rrggbb (6 hex digits)
HoopLang
// error E000
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  relleno negro { shape: canvas }
}
Terminal
e000b.hoop:4:3: error E000: `relleno` is not a primitive (fill, satin, run, triple or text)

Corrección: escribir la construcción como indica el mensaje (ver Léxico y Declaraciones).

E001 — tipo incorrecto#

Un valor no es del tipo que se espera, falta una unidad o una operación no existe entre esos tipos. Mensajes principales:

MensajeCausa
N has no unit: add mm, cm, deg or %Un número con decimales sin unidad (los enteros sin unidad son Int).
unknown unit u (use mm, cm, deg or %)Unidad desconocida (léxico: detiene el análisis).
`clave` is T, not UUna propiedad con otro tipo (`angle` is Angle or auto, not Length).
`x` is declared T but its value is U / … its default is Uconst/param cuyo valor no calza con el tipo declarado.
`x` is T but it was given UUn argumento de place con otro tipo que su param.
cannot compute T op UOperación aritmética entre tipos incompatibles (2mm + 45deg).
Int / Int has no whole result: use mod …División entre enteros.
shapes only support + (union), - (difference) and & (intersection)Otro operador entre formas.
cannot negate a T- delante de algo que no se niega (se niegan Length, Angle, Ratio e Int).
unknown type T (Length, Angle, …)Una anotación de tipo que no existe (const a: Largo = 3mm).
`clave` needs a unit (e.g. 15mm), `.m` needs a unit (e.g. 2mm)Un entero sin unidad donde va una longitud, un ángulo o un Ratio (circle(…, r: 15), .inset(2)).
a Point needs units: (1mm, 2mm)Un punto escrito con enteros sin unidad.
cannot compare T with U, T has no order (only ==, !=)Comparaciones entre tipos distintos u orden sin sentido.
and/or join Bool values, not …, not takes a Bool, not …Lógica sobre no-Bool.
a condition is a Bool (…), not TCondición de un if que no es Bool.
both branches of an if give the same type, not T and Uif como valor con ramas de distinto tipo.
a Point is (Length, Length), not (T, U)Un punto mal formado.
expected a Shape, not TSe pide una forma.
a path takes Points (x, y), not TUn segmento de path con algo que no es un punto.
rails are two open Paths: …rails de un satín mal formado.
unknown method or invalid arguments: .m(…) (…)Método de forma desconocido o con argumentos inválidos.
rect(…), circle(…), grid(…), len(String or List)Argumentos inválidos de una función (el mensaje es la firma).
a range is Int..Int (for i in 0..4), for goes over a range (0..4) or a List, not Tfor sobre algo que no es rango de enteros ni lista.
`clave` is one of: a, b, … (not T)Se esperaba un nombre de una lista (tela, ancla, fuente…).
at takes a Point (x, y), not TEl at de un place.
design arguments are named: place "x.hoop"(nombre: "ANA")Argumento de place sin nombre.
custom(width, height) takes two Length, frame: a catalog frame or custom(width, height)Un frame mal escrito.
HoopLang
// error E001
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negro { shape: canvas, angle: 2mm }
}
Terminal
e001a.hoop:4:31: error E001: `angle` is Angle or auto, not Length
HoopLang
// error E001
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negro { shape: canvas, density: 0.4 }
}
Terminal
e001b.hoop:4:40: error E001: 0.4 has no unit: add mm, cm, deg or %
HoopLang
// error E001
const x: Angle = 3mm
design "D" { canvas: rect(size: (20mm, 20mm)) }
Terminal
e001c.hoop:1:10: error E001: `x` is declared Angle but its value is Length

Corrección: dar el valor con el tipo y la unidad que pide la propiedad (ver Tipos y Expresiones).

E002 — valor fuera de rango#

El tipo es correcto pero el valor no está permitido: fuera del rango de una propiedad, un nombre que no está en la lista de valores válidos o un bucle demasiado largo.

MensajeCausa
`clave` = N mm: valid range is A to B mmUna Length fuera de rango (width de satín 0.8–8 mm, density de relleno 0.2–1 mm, …; ver Primitivas).
division by zero/ o mod con divisor cero (3mm / 0, i mod 0).
`scale` must be greater than 0%scale: de un place (o .scale(…)) en cero o negativo.
`x` is not valid for clave; did you mean `y`? / … (a, b, …)Un nombre fuera de la lista (fuente, tela, ancla, underlay, align, style).
margin = N mm: 0 to 20 mmmargin de un design.
fit: a design is 5 to 1000 mmfit fuera de rango.
unknown frame x (catalog: …)Bastidor que no está en el catálogo.
passes = N: odd, 1 to 7 (so it ends on the far side)passes de triple.
arc = N mm: the radius is at least 10 mmarc de un texto.
N iterations: a loop goes up to 1000Un for de más de 1000 vueltas.
HoopLang
// error E002
design "D" { canvas: rect(size: (40mm, 20mm)) }
thread negro = #1c1616
layer a {
  satin negro { border: canvas, width: 9mm }
}
Terminal
e002a.hoop:4:33: error E002: `width` = 9 mm: valid range is 0.8 to 8 mm
HoopLang
// error E002
design "D" { canvas: rect(size: (40mm, 20mm)) }
thread negro = #1c1616
layer a {
  text negro { value: "ANA", height: 8mm, at: (5mm, 15mm), font: ArialNegrita }
}
Terminal
e002b.hoop:4:60: error E002: `ArialNegrita` is not valid for font; did you mean `ArialBold`?

Corrección: usar un valor dentro del rango o de la lista indicada (ver Catálogos). Un satín más ancho que 8 mm se borda mejor como relleno.

Límites de recursos#

E002 también rechaza entradas que exceden los presupuestos del compilador o del formateador. No se modifica el diseño para hacerlo pasar: se debe reducir la entrada o dividir el proyecto.

RecursoLímite
Archivo fuente8 MiB UTF-8
Tokens por archivo (sin EOF)2 000 000
Nombre, incluido un nombre calificado256 caracteres
Cadena literal4096 caracteres de fuente
Texto de una primitiva text512 caracteres
Árbol de expresión o valor64 niveles (el parser además acota sus llamadas recursivas)
Anidamiento del formateador64 delimitadores
Salida formateada8 MiB, para que pueda volver a leerse
Valor evaluado200 000 elementos/caracteres/vértices en total
Evaluación de un archivo, incluidos bucles anidados y ramas descartadas10 000 000 pasos
Objetos de diseño/compilados20 000
Trabajo estimado de cosido, acumulado entre objetos y componentesunos 2,5 millones de puntadas (el mensaje dice cuántas estima)
Dependencias import/place anidadas16 niveles
Archivos cargados en una compilación128 lecturas; las bibliotecas además tienen una caché acotada
Magnitud absoluta de Length, Angle, Ratio y coordenadas1 000 000, siempre finita

Los enteros no se envuelven al desbordarse: integer overflow es E002 tanto en debug como en release. Un fit que produciría coordenadas no finitas también es E002. La carga que excede el presupuesto de lecturas se informa como un error del cargador (E007, file loading exceeds … reads). Los valores exactos viven en crates/hoop/src/limits.rs y se ejercitan en resource_limits; ver pruebas de robustez.

E003 — hilo no declarado#

Una primitiva usa un hilo que no está declarado con thread ni importado.

Salida del compilador
undeclared thread `x`; did you mean `y`?
undeclared thread `x` (declare it with thread)
HoopLang
// error E003
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negor { shape: canvas }
}
Terminal
e003.hoop:4:3: error E003: undeclared thread `negor`; did you mean `negro`?

Corrección: declarar el hilo (thread negor = #rrggbb), corregir el nombre o importarlo (ver Módulos). Un color suelto en lugar del hilo (fill #000000 { … }) es E000.

E004 — geometría inválida o vacía#

Una forma, camino o texto que no se puede bordar.

MensajeCausa
the shape is emptyUna forma de área cero.
a closed shape is required: the path is missing closeUn path abierto donde se pide una forma.
a closed path needs at least 3 pointsUn path cerrado con menos de tres puntos.
a path needs at least 2 pointsUn camino de un solo punto.
a path starts with from (x, y), from goes only at the start of the path, nothing can follow closeSegmentos de path en mal orden.
rect with zero or negative size, circle with zero or negative radius, polygon needs at least 3 PointsFunciones de forma con medidas imposibles.
run along a shape needs a single piece (this shape has several)Un corrido sobre una forma de varias piezas.
empty textvalue: "".
the text box is emptyUn box sin área.
could not build the satin border (is the shape narrower than the width?)Un satín de borde imposible (al compilar).
`x.hoop` has nothing to sewUn diseño colocado que no cose nada.
the hoop places no designsUn hoop sin place que se coloque (en la línea del hoop).
HoopLang
// error E004
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negro { shape: path { from (0mm, 0mm) line (5mm, 0mm) line (5mm, 5mm) } }
}
Terminal
e004.hoop:4:23: error E004: a closed shape is required: the path is missing close

Corrección: cerrar el camino con close, dar medidas positivas o separar la forma en piezas.

E006 — fuera de los límites#

Algo cosido queda fuera de su espacio: el canvas de un diseño (menos su margin), el área útil de un bastidor (menos su margin) o la caja de un texto.

MensajeDónde
KIND overflows the canvas by D mm SIDE / … the canvas minus its M mm margin …Un objeto de un design (KIND es fill, satin, run, triple, text o place; SIDE es on the left, on the right, at the top, at the bottom o near (x, y) en un lienzo curvo). Tolerancia: 0.3 mm.
(X, Y) mm is outside the frame's sewing area minus its marginEl at de un place en un hoop.
`x.hoop` spans (x0, y0)–(x1, y1) mm, outside the sewing area minus its M mm margin (W × H mm frame)Lo cosido de un diseño colocado en un hoop.
text does not fit its box: at the minimum height (H mm) it measures W × H mm, the box is W × H mmUn texto con box que no cabe ni a su altura mínima.
HoopLang
// error E006
design "D" {
  canvas: rect(size: (40mm, 20mm))
  margin: 2mm
}
thread negro = #1c1616
layer a {
  fill negro { shape: rect(at: (30mm, 5mm), size: (15mm, 5mm)) }
}
Terminal
e006.hoop:7:3: error E006: fill overflows the canvas minus its 2 mm margin by 7.0 mm on the right

En un hoop:

HoopLang
// error E006
hoop "H" {
  frame: Brother_100x100
  place "cuadro.hoop" at (12mm, 50mm)
}
Terminal
h_e006b.hoop:3:3: error E006: `cuadro.hoop` spans (2.0, 40.0)–(22.0, 60.0) mm, outside the sewing area minus its 5 mm margin (100 × 100 mm frame)

(cuadro.hoop es un cuadrado de 20 × 20 mm; ver Bastidor.)

Corrección: mover o achicar el objeto, ampliar el canvas o reducir el margin; en un texto con box, acortar el texto, ampliar la caja o bajar min_height.

E007 — nombres y estructura#

Un nombre repetido, desconocido o mal usado, una propiedad que no existe o que falta, o un archivo que no se puede usar.

Nombres y propiedades:

MensajeCausa
unknown name `x`; did you mean `y`? / unknown name `x`Un nombre suelto que no es nada declarado (const, shape, param, thread, variable de for, nombre importado) ni un valor de enumerado conocido (fuente, tela, ancla, auto…). Si la declaración de x falló, no se repite el error en cada uso.
`x` is used before it is declared (line N)Un nombre que se declara más abajo en el archivo.
unknown name `canvas`: declare it in the design (…)canvas en un diseño sin canvas:.
`x` is already definedNombre declarado dos veces.
layer x is already definedDos capas con el mismo nombre.
the loop variable `x` hides another name: choose anotherVariable de for que tapa otro nombre.
K has no `clave`; did you mean `c`? / K has no clave (…)Propiedad desconocida de una primitiva (fill has no densty; …).
a design has no `clave` …, a hoop has no `clave` (frame, fabric, margin, origin), place has no `clave` (anchor, rotate, scale), a thread has no `clave` (brand, code)Propiedad desconocida de una declaración.
`width` no longer scales the design: … (también height)Propiedades eliminadas del design: usar canvas o fit.
a shape has no `.m` …Miembro de forma desconocido.
unknown function f (rect, circle, polygon, grid, len)Función desconocida.
K is missing a or b, K: only one of a, bFalta la propiedad obligatoria o sobran alternativas (satin is missing rails or border or along).
duplicate `clave`Propiedad repetida en una primitiva, un design, un hoop o un place, o argumento repetido de un place.
a satin with border or along needs widthSatín sin width.
text needs height, or a box to fit into, a text with box is placed by its box: remove at``, a text in an arc does not fit a box: use at and height, min_height is for a text with boxCombinaciones inválidas de text.

Estructura del archivo:

MensajeCausa
missing design (or hoop) declarationUn archivo que se compila sin design ni hoop (en 1:1).
a file has a single design (or a single hoop)Dos design/hoop.
the hoop is missing framehoop sin frame (en la línea del hoop). Un frame desconocido da sólo su E002, sin más errores por cada place.
a hoop places designs with place; layers go in each design's filelayer en un archivo hoop.
a hoop only places designs (place, for); stitches go in a designPrimitiva, seq o inside dentro de un if/for de un hoop. Directamente en el hoop es E000 a hoop only places designs (move fill into a design file).
only a design compiles directly; a hoop places design files(API) compilar un hoop con compile en vez de montarlo.

Archivos (import y place, ver Módulos):

MensajeCausa
cannot read `f`: …Archivo inexistente o ilegible.
`f` is not a library: it has a design (only thread, const, shape and import)import de un archivo con design, hoop o layer.
`f` has no `x`; did you mean `y`?Nombre que la biblioteca no exporta.
`x` is already imported from `f`; rename one of them (`as` in the import)Nombre local igual a uno importado.
`x` is already imported from `f`Dos import traen el mismo nombre.
import cycle: a → b → a, place cycle: a → b → aCiclos. El de place se informa tal cual en el place de más afuera (sin el prefijo in …).
`f` is a hoop; place takes design filesplace de un hoop.
`f` has no param `x`; did you mean `y`?, `f` has no paramsArgumento de place que no es param.
import needs file access (compile with a file loader)(API) import verificado sin cargador de archivos.
HoopLang
// error E007
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negro { shape: canvas, densty: 0.4mm }
}
Terminal
e007a.hoop:4:31: error E007: fill has no `densty`; did you mean `density`?
HoopLang
// error E007
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
thread negro = #000000
Terminal
e007b.hoop:3:1: error E007: `negro` is already defined

Corrección: renombrar (o usar as en el import), corregir la clave según la sugerencia, agregar la propiedad que falta o corregir la ruta.

Advertencias#

W001 — detalle demasiado chico#

shape of A mm²: under 1.5 mm² does not sew cleanly: la forma de un fill o de un satin con border tiene menos de 1.5 mm² de área.

HoopLang
design "D" { canvas: rect(size: (20mm, 20mm)) }
thread negro = #1c1616
layer a {
  fill negro { shape: rect(at: (2mm, 2mm), size: (1mm, 1mm)) }
}
Terminal
w001.hoop:4:16: warning W001: shape of 1.00 mm²: under 1.5 mm² does not sew cleanly
w001.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: agrandar el detalle, borrarlo o hacerlo con un corrido.

W003 — satín ancho#

W mm satin: from 7 mm on, split it or use fill: un satín de más de 7 mm de ancho (hasta 8 mm es válido; desde ahí es E002). Las puntadas largas se enganchan y no cubren parejo.

HoopLang
design "D" { canvas: rect(size: (40mm, 30mm)) }
thread negro = #1c1616
layer a {
  satin negro { border: canvas, width: 7.5mm }
}
Terminal
w003.hoop:4:33: warning W003: 7.5 mm satin: from 7 mm on, split it or use fill
w003.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: bajar width a 7 mm o menos, o usar fill.

W004 — texto más chico que el mínimo de su fuente#

text H mm high is below the minimum for FUENTE (M mm): its letters do not sew cleanly: un texto con height (sin box) más bajo que el alto mínimo de su fuente (el mismo que usa box como piso; ver Texto). Con place … scale:, si el achicado deja un texto bajo ese mínimo, se informa en el place: at scale S%, text in x.hoop is H mm high, below the minimum for FUENTE (M mm).

HoopLang
design "D" { canvas: rect(size: (40mm, 20mm)) }
thread negro = #1c1616
layer a {
  text negro { value: "ABC", font: ArialBold, height: 4mm, at: (5mm, 12mm) }
}
Terminal
w004.hoop:4:3: warning W004: text 4 mm high is below the minimum for ArialBold (6 mm): its letters do not sew cleanly
w004.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: subir height, o usar una fuente con un mínimo menor.

W006 — diseños de un bastidor que se pisan#

`a.hoop` overlaps `b.hoop` by A mm²: dos diseños de un hoop tienen más de 0.5 mm² de huella en común. Se informa en el place posterior.

HoopLang
hoop "H" {
  frame: Brother_100x100
  place "cuadro.hoop" at (40mm, 50mm)
  place "cuadro.hoop" at (50mm, 50mm)
}
Terminal
h_w006.hoop:4:3: warning W006: `cuadro.hoop` overlaps `cuadro.hoop` by 200.0 mm²
h_w006.hoop: ok — 2 designs, 1 threads, 2 objects

Corrección: separar los at, si el solape no es intencional.

W007 — caracteres que la fuente no tiene#

FUENTE has no c, …: left out of the text: el texto tiene caracteres que la fuente no trae; no se bordan (los espacios no cuentan).

HoopLang
design "D" { canvas: rect(size: (60mm, 20mm)) }
thread negro = #1c1616
layer a {
  text negro { value: "TÉ 中", font: Arial, height: 8mm, at: (5mm, 14mm) }
}
Terminal
w007.hoop:4:3: warning W007: Arial has no `中`: left out of the text
w007.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: quitar esos caracteres o elegir una fuente que los tenga.

W008 — diseño sin lienzo#

no canvas: bounds are not checked; the design measures W × H mm (declare canvas: rect(size: (Wmm, Hmm))): el design no declara canvas, así que no se revisa que lo cosido quede dentro de un espacio. Se informa en la línea del design.

HoopLang
design "D" { fabric: Twill }
thread negro = #1c1616
layer a {
  fill negro { shape: rect(at: (0mm, 0mm), size: (30mm, 20mm)) }
}
Terminal
w008.hoop:1:1: warning W008: no canvas: bounds are not checked; the design measures 30.0 × 20.0 mm (declare `canvas: rect(size: (30mm, 20mm))`)
w008.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: declarar canvas, por ejemplo el que propone el mensaje.

W009 — fuera de su contenedor#

KIND overflows its container nombre (inside at L:C) by D mm SIDE (o … overflows the inside shape at L:C … si el contenedor no es un nombre): un objeto dentro de un bloque inside se sale de su forma (tolerancia 0.3 mm).

HoopLang
design "D" { canvas: rect(size: (40mm, 40mm)) }
thread negro = #1c1616
shape caja = rect(at: (5mm, 5mm), size: (20mm, 20mm))
layer a {
  inside caja {
    fill negro { shape: rect(at: (10mm, 10mm), size: (20mm, 5mm)) }
  }
}
Terminal
w009.hoop:6:5: warning W009: fill overflows its container `caja` (inside at 5:3) by 5.0 mm on the right
w009.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: mover o achicar el objeto, o agrandar el contenedor.

W010 — propiedad sin efecto todavía#

Una propiedad que se acepta y se valida, pero que el compilador actual no usa: `rungs` is not used yet: the satin follows its rails without them (en un satin).

HoopLang
design "D" { canvas: rect(size: (40mm, 20mm)) }
thread negro = #1c1616
layer a {
  satin negro {
    rails: (path { from (5mm, 5mm) line (35mm, 5mm) }, path { from (5mm, 9mm) line (35mm, 9mm) })
    rungs: [path { from (20mm, 5mm) line (20mm, 9mm) }]
  }
}
Terminal
w010.hoop:6:5: warning W010: `rungs` is not used yet: the satin follows its rails without them
w010.hoop: ok — 1 threads, 1 layers, 1 objects

Corrección: quitar la propiedad (no cambia las puntadas).

Avisos de máquina (sin código)#

Al producir los archivos (hoop build, descargas del playground), el motor revisa los límites de cada formato de máquina y del bastidor declarado (frame de un design o de un hoop). Estos avisos no tienen código ni línea; hoop build los imprime como <archivo>:<error|warning> (FORMATO): mensaje o <archivo>:<error|warning>: mensaje. No detienen la escritura de los archivos, pero si alguno es error, hoop build termina con código de salida 1:

HoopLang
design "Grande" { canvas: rect(size: (120mm, 40mm)), frame: Brother_100x100 }
thread negro = #1c1616
layer a { fill negro { shape: canvas } }
Terminal
$ hoop build grande.hoop out
grande.hoop:error: the design is 120.4 × 39.8 mm and does not fit the 100 × 100 mm frame
grande.hoop: 120.4 × 39.8 mm, 7338 stitches, 1 threads, 1 trims, 21 ms

hoop check revisa el frame de un design sin coser, con la caja de los objetos (puede diferir en décimas de lo bordado), y termina con 1:

Terminal
$ hoop check grande.hoop
grande.hoop: error: the design is 120.0 × 40.0 mm and does not fit the 100 × 100 mm frame

Los demás avisos de máquina (colores por formato, puntadas largas, saltos JEF) dependen de las puntadas: sólo los da hoop build.