HoopLang Docs
/
Playground
El libro · Capítulo 05

5. Hilos y paletas

En la pantalla un color es un número; en la máquina es un carrete, con una marca, un código y un lugar en el portacarretes. HoopLang trata los hilos como lo que son: cosas con nombre que se declaran. En este capítulo declaras hilos, usas las paletas de Brother y Janome que vienen con el lenguaje, y armas la biblioteca de tu club para no escribir sus colores dos veces.

thread#

HoopLang
thread negro = #1c1616 "Negro"
thread oro   = #d8a21b "Oro" { brand: "Madeira", code: "1172" }
  • negro es el nombre que usas en el código: fill negro { … }.
  • #1c1616 es el color, en hexadecimal #rrggbb: lo usa la vista previa y lo guardan los formatos que llevan color (PES, JEF, VP3…).
  • "Negro" es la etiqueta que verá quien borda en la pantalla de la máquina. Es opcional, pero ponla: "Oro" ayuda más que #d8a21b.
  • { brand: …, code: … } es opcional: la marca y el código del carrete (textos, entre comillas, aunque el código sea un número).
Salida del compilador
t.hoop:2:30: error E001: `code` is a String, not Int

Un hilo no es un color: es su propio tipo, Thread. No puedes escribir un color donde va un hilo (fill #d8a21b { … } no compila), ni guardar un color en una const y usarlo para declarar un hilo: el color de un thread se escribe directamente.

Por qué tanta ceremonia: porque en la máquina dos hilos "negros" de marcas distintas no son el mismo hilo, y porque quien borda necesita saber qué carrete poner. Un diseño que declara sus hilos es un diseño que se puede bordar sin preguntar.

El orden en que se cosen los hilos no depende del orden en que los declaras, sino de las capas (capítulo 6).

Bibliotecas de marcas#

HoopLang trae dos paletas en docs/lenguaje/bibliotecas/:

  • brother.hoop: los colores de las máquinas Brother, con nombres en inglés (brother.blue, brother.deep_gold, brother.sky_blue…).
  • janome.hoop: los hilos Janome por su código (janome.c002 es el negro, janome.c001 el blanco, janome.c207 el azul…), con la marca y el código guardados.

Una biblioteca es un archivo .hoop con sólo thread, const, shape (e import): nada que se borde. Se usa con import.

import nombre from "archivo": todo, bajo un prefijo#

HoopLang
import brother from "../bibliotecas/brother.hoop"

Trae todos los nombres de la biblioteca bajo el prefijo brother.:

HoopLang
fill brother.sky_blue { shape: cielo, angle: 90deg }

El prefijo hace que nunca te preguntes de dónde viene un nombre. Y si te equivocas al escribirlo, el compilador sabe qué había en la biblioteca:

Salida del compilador
t.hoop:3:11: error E003: undeclared thread `brother.sky_blu`; did you mean `brother.sky_blue`?

import { … } from "archivo": sólo lo que nombras#

HoopLang
import { c002 as negro, c204 as amarillo } from "../bibliotecas/janome.hoop"

Trae sólo esos nombres, sin prefijo, y as les pone otro nombre aquí. janome.c002 no dice mucho; negro, sí. Es lo que hace galeria/aplique.hoop.

Salida del compilador
t.hoop:1:10: error E007: `bibliotecas/brother.hoop` has no `sky_blu`; did you mean `sky_blue`?

No hay "importar todo sin prefijo"#

No existe una manera de traer todos los nombres de una biblioteca sin prefijo. Es a propósito: dos paletas tienen cada una su black, y mezclarlas sin aviso es la receta para bordar con el negro equivocado. Si un nombre choca, el compilador te lo dice y te sugiere as:

Salida del compilador
t.hoop:2:1: error E007: `azul` is already imported from `club.hoop`; rename one of them (`as` in the import)

Sólo viaja lo que usas#

Una paleta trae decenas de hilos, pero al archivo de máquina llegan sólo los que usa tu diseño. Importar brother.hoop entero no agrega 60 colores a tu PES.

Rutas#

Las rutas son relativas al archivo que importa. Los ejemplos de la galería están en docs/lenguaje/galeria/ y las bibliotecas en docs/lenguaje/bibliotecas/, por eso escriben "../bibliotecas/…". Las comillas pueden ser simples o dobles; hoop fmt las deja dobles.

La biblioteca de tu club#

Lo mismo sirve para lo tuyo. Si bordas para un club, sus colores, su escudo y sus medidas se escriben una vez:

HoopLang
// club.hoop: lo que comparten todos los diseños del club.
thread azul   = #1f3a8a "Azul club"
thread blanco = #f0f0f0 "Blanco"
const borde = 3mm
shape escudo = path {
  from (0mm, 0mm) line (50mm, 0mm) line (50mm, 35mm)
  curve (50mm, 50mm) (35mm, 55mm) (25mm, 60mm)
  curve (15mm, 55mm) (0mm, 50mm) (0mm, 35mm)
  close
}

y cada diseño la importa, combinada con la paleta de la marca de hilo que tengas en el taller:

HoopLang
import club from "club.hoop"
import { c002 as negro } from "bibliotecas/janome.hoop"

design "Club" { canvas: rect(size: (50mm, 60mm)) }

layer fondo { fill club.azul { shape: club.escudo.inset(club.borde) } }
layer borde { satin negro { border: club.escudo, width: club.borde } }
Salida del compilador
insignia-club.hoop: ok — 2 threads, 2 layers, 2 objects

Todo lo de una biblioteca se usa como si fuera tuyo: club.escudo.inset(2mm), club.escudo.center, club.borde * 2. Si el club cambia de azul, cambias una línea de club.hoop y todos los diseños cambian.

Algunas reglas que conviene conocer:

  • Una biblioteca no reexporta lo que ella importa: si club.hoop importa janome.hoop, tu diseño no ve janome a través de club.

  • Lo que la biblioteca usa por dentro sigue valiendo aunque aquí se llame distinto.

  • Sus errores se informan en la línea de tu import, con el archivo y la posición.

  • Un archivo con design o layer no es una biblioteca:

    Salida del compilador
    t.hoop:1:1: error E007: `galeria/insignia.hoop` is not a library: it has a design (only thread, const, shape and import)

    Para usar otro diseño entero dentro del tuyo, se coloca con place (capítulo 7).

  • hoop check también revisa una biblioteca sola, y cuenta lo que trae:

    Salida del compilador
    club.hoop: library — 3 threads, 0 consts, 0 shapes

Resumen#

  • thread nombre = #rrggbb "Etiqueta" { brand:, code: } declara un carrete; un Thread no es un Color.
  • import marca from "archivo" trae todo bajo marca.; import { a, b as c } from "archivo" trae sólo esos nombres.
  • No hay importación sin prefijo; los choques de nombres son E007.
  • Al archivo de máquina llegan sólo los hilos que usas.
  • Una biblioteca tiene sólo thread, const, shape e import.

Referencia: módulos · declaraciones · catálogos