REPL Interactive
La REPL Catnip utilise une implémentation Rust native (catnip-repl) en binaire standalone.
La REPL s'inscrit dans la tradition Lisp (lecture/évaluation/affichage). Dialogue direct avec le runtime: latence humaine, réponse machine.
Architecture REPL
Catnip fournit deux modes REPL selon le contexte :
REPL Rust (mode par défaut)
Binaire standalone catnip-repl implémenté en Rust pur :
- Rapide : startup instantané, exécution native
- Standalone : aucune dépendance Python runtime
- Optimisé : VM bytecode + JIT intégré
- Source :
catnip_rs/src/bin/repl.rs
Utilisé automatiquement pour code Catnip pur.
REPL Python (minimal)
Wrapper léger MinimalREPL pour intégration Python (-f/--feature) :
- Contexte Python : accès aux modules chargés (
-f math, etc.) - Pipeline complet : parsing → semantic → execution Python
- Source :
catnip/repl/minimal.py
Activé automatiquement si catnip -f module ou catnip repl -f module.
Lancement
# REPL Rust (par défaut)
catnip # Mode interactif rapide
catnip -v # Mode verbeux
# REPL Python (avec features)
catnip -f math # Charge module Python, REPL Python
catnip -f ./api.py:api -f numpy:np # Multi-modules
# Mode pipe (non-interactif)
echo "2+3" | catnip
Commandes REPL
Les commandes commencent par / :
| Commande | Description |
|---|---|
/help |
Afficher l'aide |
/exit, /quit |
Quitter la REPL |
/clear |
Effacer la sortie |
/history |
Afficher l'historique |
/load <file> |
Charger et exécuter un fichier .cat |
/stats |
Statistiques d'exécution |
/jit |
Activer/désactiver le JIT |
/verbose |
Activer/désactiver le mode verbeux |
/debug |
Activer/désactiver le mode debug |
/time <expr> |
Benchmarker une expression |
/version |
Afficher la version |
Raccourcis clavier
REPL Rust (par défaut)
| Raccourci | Action |
|---|---|
| Ctrl+D | Quitter (ligne vide) |
| Ctrl+C | Annuler la saisie courante |
| Up/Down | Naviguer dans l'historique |
REPL Python (minimal)
La REPL Python minimal offre une interface simplifiée :
| Raccourci | Action |
|---|---|
| Ctrl+D | Quitter (ligne vide) |
| Ctrl+C | Annuler la saisie courante |
Pas d'auto-complétion ni de recherche historique avancée - focus sur compatibilité features Python.
Auto-complétion (REPL Rust)
Tab complète :
- Mots-cles du langage (
if,while,match, etc.) - Variables définies dans le contexte
- Fonctions builtin (
print,len,range, etc.) - Commandes REPL (
/help,/exit, etc.)
Recherche historique (REPL Rust)
L'historique est persistant dans ~/.catnip_history (par défaut).
Multiline
La REPL détecte automatiquement les expressions multilignes :
- Délimiteurs non fermés (
{,(,[) - Opérateurs en fin de ligne (
+,-,*, etc.) - Mots-clés de contrôle (
if,while,for, etc.)
Alt+Enter ou Ctrl+J force une nouvelle ligne même si l'expression semble complète.
▸ f = (x) => {
▹ x * 2
▹ }
▸ f(21)
42
Affichage des résultats
La REPL affiche automatiquement le résultat de chaque expression évaluée, y compris None :
▸ 42
42
▸ "hello"
hello
▸ None
None
Comportement (différent de Python) :
- Toutes les valeurs sont affichées, y compris
None - Clarté maximale en développement : aucun résultat n'est silencieux
Rationale : La REPL est un outil de développement. Afficher explicitement None évite toute ambiguïté sur le retour d'une expression (erreur vs None vs pas de retour).
Comparaison avec Python :
# Python REPL
>>> None
>>> # Pas d'affichage
# Catnip REPL
▸ None
None # Affichage explicite
Choix de REPL
Le CLI détecte automatiquement quelle REPL utiliser :
# REPL Rust (standalone)
catnip # Aucune feature → REPL Rust
catnip -o jit script.cat # Pas de -f → REPL Rust si erreur
# REPL Python (wrapper)
catnip -f math # -f présent → REPL Python
catnip -f ./api.py:api # idem
Règle : Présence de -f/--feature déclenche REPL Python (accès contexte modules). Sinon, REPL Rust (standalone).
Erreur REPL manquante
Si catnip-repl n'est pas disponible :
Error: Rust REPL 'catnip-repl' not found in PATH
Install it with: make compile
Solution : recompiler le projet pour générer le binaire REPL :
make compile
# ou
make setup