En un panorama de lenguajes de programación cada vez más complejos, Janet se presenta como una propuesta singular: un pequeño dialecto de Lisp que combina simplicidad, potencia expresiva y portabilidad. Este artículo del autor del libro 'Janet for Mortals' —publicado en abierto— defiende por qué cualquier programador debería darle una oportunidad.
Janet es un lenguaje imperativo con funciones de primera clase, un único espacio de nombres para identificadores y ámbito léxico. Su núcleo se reduce a ocho instrucciones (do, def, var, set, if, while, break y fn), complementadas por macros que aportan estructuras de control de alto nivel. Según el autor, el lenguaje puede aprenderse en una tarde, ya que su semántica resulta familiar —similar a JavaScript, pero sin comportamientos inesperados— y su biblioteca estándar cabe en una página.
Una de las características más notables es su capacidad de distribución. Janet se compila a bytecode, que se integra en un archivo .c junto con el runtime. El resultado es un ejecutable nativo con enlace estático. Un 'hola mundo' compilado pesa menos de un megabyte (784K en macOS con chip aarch64, versión 1.27.0) e incluye el recolector de basura e incluso el compilador de bytecode, lo que permite evaluar código Janet en tiempo de ejecución.
Para el tratamiento de texto, Janet abandona las expresiones regulares en favor de gramáticas de expresiones de parsing (PEG), más potentes y predecibles: funcionan con texto multilínea, JSON, HTML e incluso formatos binarios, y son componibles y de primera clase.
El lenguaje sobresale también en la automatización de procesos del sistema. La biblioteca de terceros janet-sh ofrece un DSL para expresar pipes y redirecciones directamente en Janet, comparable a Bash pero con la expresividad de un lenguaje de alto nivel.
Janet está diseñado para ser embebido: su runtime es una pequeña biblioteca C que cualquier programa puede vincular para exponer interfaces de scripting. Además, incorpora colecciones mutables e inmutables —algo poco habitual— y un sistema de macros que, aunque no es higiénico, permite escribir código referencialmente transparente mediante unquote de funciones literales.
La característica más singular es la capacidad de transferir valores del momento de compilación al de ejecución: cualquier valor puede serializarse, conservando referencias compartidas, generadores y cierres. Esto facilita, por ejemplo, autogenerar enlaces de base de datos a partir de un esquema SQL durante la compilación.
