BookinglyTech News
Software

Janet añade un sistema de tipos gradual con la nueva macro deft

La comunidad de Janet ahora puede usar anotaciones de tipos opcionales mediante la macro deft, que permite definir funciones y valores con tipos estáticos o dinámicos de forma progresiva.

2 min de lecturaLobsters0 vistas

La última actualización de Janet incluye la macro deft que permite añadir anotaciones de tipos directamente después de los nombres de las variables y funciones. Con esta extensión, los desarrolladores pueden pasar de código sin tipos a código con tipos estáticos sin cambiar la sintaxis base del lenguaje.

Cómo funciona

En la macro de define se aceptan anotaciones de tipo opcionales después de cada parámetro y opcionalmente después de la lista de argumentos. Por ejemplo:

(define add [x :number y :number] :number (+ x y))

Si se omite la anotación, el parámetro se trata como :dynamic, o bien se infiere en tiempo de ejecución cuando la inferencia está habilitada:

(define greet [name] (string "Hello, " name "!"))

El cuerpo de las funciones con tipos estáticos se envuelve en casts de argumentos y de retorno. Cuando el cast falla, la culpa se asigna al llamador (argumento incorrecto) o a la propia función (valor de retorno incorrecto).

Definición de tipos personalizados

Con deftype se pueden crear tipos basados en predicados booleanos. Un tipo puede ser una combinación lógica de otros tipos, lo que permite aproximarse a uniones, intersecciones y negaciones. Ejemplo:

(deftype :even even?)
(deftype :positive (fn [v] (and (number? v) (> v 0))))
(deftype :nonzero (or :positive :negative))

Los tipos también pueden aplicarse a colecciones. Aunque el soporte de contenedores está limitado a las estructuras nativas de Janet, los elementos pueden ser de cualquier tipo definido:

(deftype :numeric-array (:array :number))

Valores y constantes

Para valores estáticos se utiliza deftval que incluye un cast en tiempo de definición:

(define phi :number 1.618033988)

Las constantes inmutables se marcan con :immutable:

(define phi (:and :number :immutable) 1.618033988)

Compatibilidad y transición

La macro deft reemplaza a defn, deftfn, var, ~def y deftval, ofreciendo un camino fluido de código sin tipos a código tipado. La inferencia permite que funciones parcialmente anotadas sigan funcionando sin cambios, mientras que los tipos completos garantizan comprobaciones en tiempo de ejecución.

Importancia práctica

Para equipos que utilizan Janet, esta funcionalidad facilita la incorporación gradual de tipos sin refactorizar todo el código base. Además, la capacidad de definir tipos personalizados abre la puerta a contratos más precisos y a una mejor documentación interna, sin sacrificar la flexibilidad del lenguaje.

El cambio es especialmente útil en proyectos con requisitos de robustez incremental, donde el coste de añadir tipos estáticos a un código existente puede ser alto. Con deft, la comunidad puede adoptar una estrategia de tipado progresivo, manteniendo la legibilidad y la rapidez de desarrollo.