Construir un DSL de Brainfuck en Forth con generación de código

Este artículo explica cómo integrar Brainfuck como lenguaje de dominio específico (DSL) dentro de Forth, aprovechando las capacidades de metaprogramación de Forth en lugar de escribir un intérprete convencional. La idea central es que el código Brainfuck se embebe directamente en programas Forth y s

Macros en Lisp: cómo escribir tus propias abstracciones

Este capítulo introduce la escritura de macros en Lisp, una herramienta que permite a los programadores crear sus propias abstracciones por encima del lenguaje y la biblioteca estándar. A diferencia de las funciones, las macros operan en tiempo de expansión del código: generan código que después ser

Macros en Emacs Lisp: la belleza de programas que escriben programas

Las macros de Emacs Lisp son piezas de código que reciben formas sin evaluar y devuelven código nuevo, transformándose en pequeños programas que escriben otros programas. Operan en tiempo de expansión, antes de que el programa principal se ejecute, y permiten extender el lenguaje sin tocar el intérp

Implementación de Forth en Lisp mediante macros

Este capítulo de 'Let Over Lambda' culmina una serie de técnicas de macros Lisp aplicadas a la construcción de un intérprete del lenguaje Forth dentro de Lisp. El objetivo no es meramente didáctico: el autor busca mostrar cómo Forth puede replantearse cuando se dispone de la potencia expresiva de Li

Cómo escribir un quine: una guía con alegoría y ejemplos en Python

Un quine es un programa que imprime su propio código fuente sin recurrir a introspección, una idea clásica de la informática que resulta a la vez desconcertante y elegante. Este texto explica, en dos partes, cómo construir uno. En la primera se recurre a una alegoría: una máquina capaz de fabricar c

Conjuntos de sobrecarga en D: cómo construir APIs de plantillas ad-hoc

El lenguaje de programación D permite agrupar funciones que comparten nombre y cabecera de plantilla bajo un mismo conjunto de sobrecarga (overload set), un mecanismo que sustenta buena parte de su programación genérica. Combinado con la especialización de plantillas, este recurso da lugar a las lla

Camino a Lisp: una guía para elegir dialecto

Lisp no es un único lenguaje, sino una familia con más de veinte dialectos que comparten una sintaxis fundamental pero divergen en operadores, bibliotecas y capacidades. Esta guía, primera entrega de una serie, ayuda a principiantes a superar la indecisión inicial: cualquier dialecto enseña los conc

Borrado de tipos en C++26 con reflexión: la librería duck lo simplifica

La librería rjk::duck, publicada como un único header, aprovecha las anotaciones y la metaprogramación por reflexión introducidas en C++26 para implementar borrado de tipos sin la verbosidad habitual. En lugar de escribir a mano cientos de líneas de código propensas a errores —o recurrir a alternati

Rhombus: metaprogramación flexible con sintaxis tipo Python

Rhombus es un lenguaje de programación reciente que combina la potencia de la metaprogramación de Racket con una sintaxis sencilla inspirada en Python, basada en indentación y el delimitador ":". Su núcleo se distribuye bajo licencia MIT o Apache 2.0 y se ejecuta sobre el runtime de Racket, lo que l

Rhombus 1.0: un nuevo lenguaje de programación extensible sobre Racket

Rhombus es un lenguaje de programación de propósito general, funcional, dinámico y extensible que acaba de alcanzar su versión 1.0. Está construido sobre Racket, del que hereda herramientas como el entorno DrRacket y la suite de línea de comandos raco, y se activa simplemente iniciando un módulo con

Lisp implementado dentro del sistema de tipos de Rust

El repositorio "lisp-in-types", publicado en GitHub por el usuario playX18, ofrece una implementación del lenguaje de programación Lisp construida por completo sobre el sistema de tipos de Rust, de modo que los programas en Lisp se expresan como tipos y se evalúan en tiempo de compilación mediante t

Struct-of-arrays en Zig: comptime y reflexión de tipos

En Zig, los tipos son valores en tiempo de compilación: pueden asignarse a constantes, pasarse como argumentos a funciones y devolverse desde ellas. Esta característica, conocida como comptime, es la base de los tipos genéricos del lenguaje y la pieza clave detrás de MultiArrayList, una colección de

Escribir un macro bitflags: introducción a los macros procedimentales de Rust

Este capítulo explora los macros procedimentales de Rust mediante la construcción de un macro bitflags desde cero. Comienza distinguiendo los macros de las funciones ordinarias: aunque ambos mapean entradas a salidas, los macros operan sobre el código fuente en lugar de sobre variables en tiempo de

Por qué deberías probar Janet, un dialecto de Lisp minimalista

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é cua

TinyAPL: Combinadores impulsan la programación funcional

## Combinadores en TinyAPL: Funciones que Transforman la Programación Funcional ¿Qué son y por qué son importantes? En el mundo de la programación funcional, los combinadores son una herramienta poderosa y a menudo sutil. En esencia, un combinador es una función que *no modifica* sus argumentos o

Clojure y Java: Solucionan Retraso de Inicio en OpenLDK

Este artículo aborda un problema de rendimiento significativo encontrado al integrar Clojure (un lenguaje funcional) con OpenLDK, una implementación de Common Lisp que se ejecuta sobre la Máquina Virtual de Java (JVM). Inicialmente, el tiempo de inicio de Clojure en OpenLDK era excesivamente largo (