Changelog
0.0.8 (unreleased)
Changements depuis v0.0.7 (2026-03-26).
Langage
- Type énuméré :
enum Name { variant1; variant2 }avec variantes qualifiéesName.variantet pattern matching dansmatch - Statement
import:import('math')bind automatiquementmathdans le scope courant. Les formes expression (m = import('math')) et sélective (import('math', 'sqrt')) restent inchangées - Context managers (
with) :with a = expr { body }garantit__exit__en sortie de bloc. Multi-binding, cleanup en ordre inverse, suppression d'exception si__exit__retourne truthy try/except/finally/raise: gestion d'erreurs avec syntaxe match-like. Clauses typées (e: TypeError => { }), union de types (ValueError | KeyError), wildcard (_ => { }), binding optionnel- Types d'exception built-in :
TypeError,ValueError,NameError,IndexError,KeyError,AttributeError,ZeroDivisionError,RuntimeError,MemoryError - Hiérarchie d'exceptions :
Exception(racine),ArithmeticError,LookupError. Matching via MRO :except ArithmeticErrorcatchZeroDivisionError - Structs d'exception :
struct AppError extends(RuntimeError) { message }fonctionne avec le matching par hiérarchie - Pattern struct dans tuple :
(Point{x, y}, z)avec guards et dispatch par type - Complex natif :
ExtendedValue::Complex(f64, f64)dans la PureVM,TAG_COMPLEXdans la VM principale. Arithmétique,.real/.imag/.conjugate(),abs(),hash(),complex(), interop PyComplex. Les littérauxj/Jcompilent nativement (plus de fallback Python) - Module
http:http.serve("<h1>Hello</h1>")lance un serveur local et ouvre le navigateur.http.Server(addr)pour le contrôle fin (recv, respond). Content-type auto-détecté
Outils
- Formatter source-aware : préserve l'intention du développeur. Layout inline/multiline, if/else, method chains et struct bodies suivent la source. Trailing comma reste le signal pour forcer multiline
- Formatter try/except : support complet du formatage try/except/finally/raise
- Linter : 11 nouvelles règles : code mort (W300, W301, W302), paramètres inutilisés (W201), shadowing (W204), métriques (I200 nesting, I201 cyclomatique, I202 longueur, I203 paramètres, I103 match sans catch-all)
- Seuils configurables :
--max-depth,--max-complexity,--max-length,--max-paramsvia CLI et API Python - Suppression inline
# noqa:# noqa(tous),# noqa: E200(spécifique),# noqa: E200, W200(multiple) - Analyse deep (
--deep) : W310 détecte les variables possiblement non initialisées. W311 détecte le code mort après des branches qui terminent toutes
CLI
- Expansion de fichiers :
catnip lintetcatnip formatacceptent dossiers (récursif*.cat) et globs - Shell completion : fix perte des completions
plainquand une entréefilesuit --versiondétaillé : affiche commit et date de build (-V= version courte)
Bugfixes
- Cache d'import : modules homonymes dans des répertoires différents ne se polluent plus
cached(): fonctions retournantNonecorrectement mémoïséescached():f(a=1, b=2)etf(b=2, a=1)partagent la même entrée de cache--policy sandboxlit correctement[modules.policies.sandbox]danscatnip.toml- Policy :
import('.secret')relatif vérifié contre la policy (plus contournable) - CLI :
catnip bench N script.catetcatnip --no-jit -- script.catfonctionnent correctement - Linter I100 : commentaire trailing après un tail call ne déclenche plus le hint TCO
- Linter W310 : fix faux positifs sur
matchexhaustif avec wildcard_ - Linter W310 : fix faux positifs sur variables définies dans
exceptou avanttry
0.0.7 (2026-03-26)
Changements depuis v0.0.6 (2026-03-02).
Langage
typeof(): intrinsic natif retournant le nom du type (remplacetype())freeze()/thaw(): sérialisation binaireglobals()etlocals(): introspection du scope- Nil-coalescing
??:a ?? bretourneasi non-None, sinon évalueb in/not in: membership operators (list, tuple, dict, set, string)is/is not: identity operators (x is None)and/orretournent bool : utiliser??pour le patternvalue or defaultfoldetreduce: primitives d'agrégation- Import sélectif :
import('math', 'sqrt', 'pi:p') - Noms dotted :
import('mylib.utils')cherchemylib/utils.cat - Packages
lib.toml: répertoire avec manifeste, entry point, filtrage exports - Policies nommées :
--policy <name>avec[modules.policies.<name>]danscatnip.toml NDetRUNTIME: namespaces builtin (ND.thread,RUNTIME.smallint_max, etc.)META.fileetMETA.main: chemin du fichier et détection d'exécution directe- Dot-continuation : chaînage multilignes avec
.en début de ligne - Struct fields :
;après les champs est désormais optionnel - Précédence
**vs-:-x**2donne-(x**2)
Stdlib
- Module
io:print,write,writeln,eprint,input,open(auto-importé en CLI/REPL) - Module
sys:argv,environ,executable,version,platform,cpu_count,exit()
CLI
catnip: binaire unique pour exécution et outils (remplacecatnip-run)catnip lsp: serveur LSP (diagnostics, formatting, rename scope-aware)- Shell completion :
catnip completion bash|zsh|fish -q/--quiet: supprime l'affichage du résultatCATNIP_CONFIG: variable d'environnement pour config alternative- Suffixes
-m:-m math:m(alias),-m io:!(injection globals) - Validation stricte :
-oet pragmas rejettent les valeurs invalides
REPL
- Ctrl+C : interrompt les exécutions longues
- Ctrl+R : recherche inversée dans l'historique
- Complétion d'attributs : après
., propose les attributs réels viadir() - Affichage struct :
Point(x=74, y=5.3)au lieu deNone - Auto-indent selon le niveau d'imbrication
/context: inspecter les variables utilisateur- Multiline paste : les lignes commençant par
.sont jointes à la précédente
Outils
- MCP server (
catnip-mcp) : parse, eval, check, format, debug via Model Context Protocol - Formatter : espacement, alignement en colonne, préservation multilignes, indentation des chaînes postfix
- Linter W200 scope-aware : "variable non utilisée" ne s'applique plus au scope global
- Debugger : sous-mode
repldans le scope du point d'arrêt
Performance
- ND recursion ~200x plus rapide
- JIT warm-start : traces compilées chargées depuis le cache disque
Bugfixes
- Segfault dans les boucles
foravec mutation conditionnelle - Crash réassignation struct entre types différents
float('nan')retournait0- F-strings :
f"{x}"utilise maintenantstr(x)correctement - Closures capturent les variables englobantes dans
fold,map, etc. - Variables locales préservées après exécution JIT
- Positions UTF-8 correctes dans les messages d'erreur
- Import sélectif atomique (pas de globals partiellement modifié en cas d'erreur)
- Breakpoints dynamiques fonctionnels pendant une session debug active
- Overflow arithmétique détecté au lieu de wrapping silencieux