REPL interactive

La REPL exécute du Catnip dans un contexte persistant : les variables, pragmas et modules restent disponibles entre deux entrées.

Lecture, évaluation, affichage. Le runtime répond avant que la question ne devienne un fichier.

Lancement

catnip
catnip repl
catnip-repl

Les trois formes ouvrent la REPL Rust par défaut. Une sortie normale retourne 0 ; une interruption par Ctrl+C au prompt vide retourne 130.

x = 10
x * 2
20

Le mode pipe n'ouvre pas la REPL :

echo "2 + 3" | catnip
# ⇒ 5

Commandes

Les commandes commencent par / :

Commande Description
/help Afficher l'aide
/exit, /quit Quitter
/clear Effacer la sortie
/history Afficher l'historique
/load FILE Charger un fichier .cat
/context [VAR] Inspecter les variables utilisateur
/stats Afficher les statistiques d'exécution
/jit Activer ou désactiver le JIT
/verbose Activer ou désactiver le mode verbeux
/debug Activer ou désactiver le mode debug
/time EXPR Mesurer une expression
/config Ouvrir l'éditeur de configuration
/version Afficher la version

exit() n'est pas une fonction du langage. Utiliser /exit, /quit ou Ctrl+D. Pour terminer un programme depuis le code, charger sys puis appeler sys.exit(code).

Éditeur de configuration (/config)

/config ouvre un overlay interactif. Les groupes n'ont pas tous la même durée de vie :

Groupe Exemples de clés Persistance
execution executor, optimize, tco, jit catnip.toml
display no_color, theme catnip.toml
cache enable_cache, taille, TTL catnip.toml
debug rapports internes, limite mémoire catnip.toml
format indentation, longueur de ligne catnip.toml
repl temps de parsing, debug, taille d'historique session

Chaque valeur affiche sa source : default, file, env, cli ou session. Un * signale une valeur différente du défaut.

Navigation principale :

Touche Action
Up/Down ou k/j Changer de clé
Tab / Shift+Tab Changer de groupe
Enter / Space Basculer, cycler ou éditer
r Revenir au défaut
? Afficher l'aide
Esc, q ou Ctrl+C Fermer l'éditeur

Les commandes textuelles restent disponibles :

/config show
/config get KEY
/config set KEY VALUE
/config path

La référence des clés et de leur précédence est dans CONFIG.

Raccourcis

REPL Rust

Raccourci Action
Ctrl+D Quitter sur une ligne vide
Ctrl+C Interrompre l'exécution ou annuler la saisie
Ctrl+R Rechercher dans l'historique
Up/Down Parcourir l'historique
Ctrl+A / Home Aller au début de la ligne
Ctrl+E / End Aller à la fin de la ligne
Ctrl+U Effacer la ligne
Ctrl+W Effacer le mot précédent
Ctrl+Left/Right Se déplacer par mot
Ctrl+L Effacer l'écran
Tab Ouvrir ou accepter la complétion
Right Accepter le ghost text
Escape Fermer le popup de complétion

Pendant une exécution, Ctrl+C demande l'interruption à la VM. Au prompt, il annule la ligne courante ; sur une ligne vide, il quitte.

REPL Python

Raccourci Action
Ctrl+D Quitter sur une ligne vide
Ctrl+C Annuler la saisie ou quitter sur une ligne vide

Cette REPL minimale n'expose ni popup de complétion ni recherche historique avancée.

Complétion et ghost text

Dans la REPL Rust, Tab ouvre une liste contextuelle :

  • variables du contexte ;
  • mots-clés ;
  • builtins ;
  • commandes /... ;
  • attributs et méthodes après un point.

Après io., la REPL inspecte le module. Après une instance de struct, elle propose ses champs et méthodes. Si la variable n'est pas connue, elle propose les méthodes usuelles de str, list et dict.

Tab et Down sélectionnent l'entrée suivante ; Shift+Tab et Up sélectionnent la précédente.

Le ghost text complète directement la ligne :

  • paramètres restants d'un appel ;
  • structure d'un mot-clé ;
  • fin d'un identifiant et sa signature.

La flèche droite l'accepte. Tab ouvre le popup et le masque ; Escape ferme le popup.

Historique

L'historique est stocké dans :

$XDG_STATE_HOME/catnip/repl_history

Sans XDG_STATE_HOME, le chemin est ~/.local/state/catnip/repl_history. Si aucun dossier personnel n'est déterminable, l'historique reste en mémoire pour la session : la REPL fonctionne, mais n'écrit pas dans le répertoire depuis lequel elle a été lancée.

Ctrl+R ouvre la recherche inverse. Saisir filtre les entrées ; Ctrl+R passe au résultat suivant, Enter l'accepte et Escape annule.

Expressions multilignes

La REPL continue la saisie quand elle détecte :

  • un délimiteur non fermé ;
  • un opérateur en fin de ligne ;
  • une structure de contrôle incomplète.

Elle indente selon les accolades, parenthèses et crochets ouverts :

double = (value) => {
      value * 2
  }
double(21)
42

Inspection du contexte

/context affiche les variables utilisateur avec leur type et une valeur tronquée. /context NAME affiche une valeur complète :

x = 42
name = "Alice"
/context
  name             str          'Alice'
  x                int          42
/context x
x: int = 42

Les builtins et les noms internes préfixés par _ sont exclus.

Pragmas

Les pragmas persistent entre les évaluations :

pragma("jit", True)
pragma("tco", False)

La précédence est : CLI, puis état de la REPL, puis valeurs par défaut.

Résultats

La REPL affiche le résultat de chaque expression. None ne produit aucune ligne :

42
42
x = 10
10
while (False) { 1 }

En mode verbose, None reste visible dans l'étape RESULT.

Choix de la REPL

La CLI choisit la REPL selon la présence de modules Python :

Invocation REPL utilisée Propriété principale
catnip Rust TUI, complétion, ghost text, historique
catnip -m math Python Namespace Python chargé
catnip -m math -m numpy Python Plusieurs namespaces Python

La présence de -m ou --module sélectionne donc la REPL Python. Les règles de chargement sont dans MODULE_LOADING.

Erreurs

Une erreur affiche la position source et la chaîne d'appels :

f = (x) => { x / 0 }
f(42)
File '<repl>', line 2, column 6: division by zero
    2 | f(42)
    |      ^
CatnipRuntimeError: division by zero

La session reste ouverte et les variables définies avant l'erreur restent disponibles.

Coloration syntaxique

La REPL Rust utilise tree-sitter pour coloriser mots-clés, constantes, nombres, chaînes, commentaires, opérateurs, builtins et ponctuation pendant la saisie. Les nœuds incomplets restent parcourus afin de conserver la coloration avant la fermeture d'un bloc.