Cómo escribir un intérprete de Lisp en Python

Fuentes: How to Write a (Lisp) Interpreter (in Python)

Este artículo es un tutorial paso a paso para construir un intérprete de Scheme (un dialecto de Lisp) utilizando Python. El texto parte de la premisa de Steve Yegge según la cual, si no se sabe cómo funcionan los compiladores, no se entiende de verdad cómo funcionan los ordenadores, y aplica esa idea a la construcción práctica de un intérprete.

El recorrido comienza comparando la sintaxis de Scheme con la de Java, ilustrando la extrema simplicidad del primero: todo se expresa con paréntesis y símbolos, sin palabras clave, operadores infijos ni reglas de precedencia. A partir de ahí se define un lenguaje simplificado con cinco tipos de expresiones: referencia a variable, literal numérico, condicional, definición y llamada a procedimiento, cada uno acompañado de su semántica y un ejemplo.

El núcleo del artículo muestra el ciclo clásico de un intérprete — programa → análisis sintáctico → árbol de sintaxis abstracta → evaluación → resultado — y lo implementa en Python. Primero se tokeniza el código, luego se construye el AST con un parser recursivo descendente, y por último se evalúa recorriendo el árbol mediante pattern matching sobre listas y símbolos. El entorno de evaluación se construye mapeando operadores de Python (operador y math) a primitivas de Scheme ( +, -, *, /, sin, cos, sqrt, pi, etc.), junto con formas especiales como begin, define o if. El tutorial cierra con la función eval, que despacha sobre el tipo de expresión y delega en el entorno, sentando las bases para, en una segunda parte, ampliar el intérprete a un Scheme casi completo.