Derniere mise a jour : 9 fevrier 2026

Mini Interpreteur Lisp

2024 Langages C

Presentation

Objectif principal : Un interpreteur pour un sous-ensemble de Lisp. Lire du code Lisp, le parser en S-expressions, et l'evaluer. Avec les formes speciales (if, define, lambda) et les fonctions de base.

Technologies utilisees : C pur. Parser pour les S-expressions (recursif, les parentheses c'est facile). Garbage collector basique mark-and-sweep pour la memoire.

Fonctionnalites cles : Arithmetique (+, -, *, /), comparaisons, listes (car, cdr, cons), conditionnels (if), variables (define), fonctions (lambda), recursion. REPL interactif.

Livrables attendus : Un interpreteur avec un REPL. Capable d'executer des programmes recursifs classiques (factorielle, fibonacci, etc.).

Calendrier previsionnel : Trois semaines. Comprendre l'evaluation Lisp et implementer le GC ca prend du temps.

Parties prenantes & criteres de succes : Projet perso pour apprendre la programmation fonctionnelle et les interpreteurs. Lisp c'est le langage parfait pour ca car simple a parser.

Le Defi

Le garbage collector. En Lisp on cree plein d'objets temporaires (les listes), faut les liberer sinon ca explose la memoire. Mais faut pas liberer ce qui est encore utilise. Mark-and-sweep c'est la solution classique.

La Solution

Tous les objets sont dans une liste globale. Quand je manque de memoire, je marque tous les objets accessibles depuis les racines (stack, environnement global), puis je libere ceux qui sont pas marques. Simple mais ca marche.

Architecture Technique

Structure LispObject avec un tag type (NUMBER, SYMBOL, CONS, LAMBDA...) et une union pour la valeur. Module reader.c qui parse les S-expressions. Module eval.c qui evalue recursivement. Module env.c pour les environnements (scope). Module gc.c pour le garbage collector.

Points Cles

  • Parser de S-expressions
  • Lambda et closures
  • Garbage collector mark-and-sweep

Apercu

Resultats & Apprentissages

Je peux ecrire des programmes Lisp et les executer dans mon interpreteur. Fibonacci recursif marche, les closures aussi. J'ai vraiment compris la programmation fonctionnelle et pourquoi Lisp est elegant. Le GC c'est fascinant.

Evolutions Futures

Macros (le vrai pouvoir de Lisp). Tail call optimization pour la recursion infinie. Un meilleur GC (generational). Peut-etre compiler en bytecode au lieu d'interpreter directement.

Retour aux projets Me contacter