hyper.dev
well come

đŸ–đŸœ

2026-11-08 · möbius - 10 - Je vous apprends la langue du feu

bb.py v0.3.0, ou ce qui arrive le lendemain

« Bonjour » devient « bofonjofoufur ». C’est la langue du feu, un jeu d’enfants : aprĂšs chaque voyelle, un f et la mĂȘme voyelle. J’en avais fait la premiĂšre dĂ©monstration de bb.py, parce qu’elle montre une chose simple : Ă©crivez l’encodeur en français, en japonais ou en arabe, et les trois fonctions ont le mĂȘme hash.

def encoder_langue_du_feu(texte): ...      # français
def ç«ăźèš€è‘‰ă«ć€‰æ›(文章): ...                 # japonais
def ŰȘŰŽÙÙŠŰ±_لŰșŰ©_Ű§Ù„Ù†Ű§Ű±(Ù†Ű”): ...                 # arabe
$ bb add feu_fra.py@fra
Hash: 5fe367ff2488ad9083034991a28db92f9be781f409adc395844a36e930bf3589
$ bb add feu_jpn.py@jpn
Hash: 5fe367ff2488ad9083034991a28db92f9be781f409adc395844a36e930bf3589
$ bb add feu_ara.py@ara
Hash: 5fe367ff2488ad9083034991a28db92f9be781f409adc395844a36e930bf3589

Personne n’a traduit personne. Les noms et la documentation restent dans leur langue, le hash ne regarde que la logique. Les chaünes, elles, restent françaises : traduire les chaünes, c’est de l’i18n, pas du code multilingue.

Mais un programme ne vit pas une fois pour toutes. Voici ce que fait la v0.3 le lendemain.

La rĂšgle que j’avais codĂ©e n’était pas celle que je connais

Le jeu que je connais traite « ou » et « oi » comme une seule voyelle : mou devient moufou, moi devient moifoi. Mon encodeur, lui, double chaque lettre voyelle une Ă  une. J’écris donc les trois cas dans un fichier d’édition, sous forme de checks, et j’essaie de sauvegarder l’ancien code :

$ bb edit encoder_langue_du_feu@fra feu.md -m "Ajouter les checks"
FAIL check_feu_moi: returned False ('mofoifi' == 'moifoi')
FAIL check_feu_mou: returned False ('mofoufu' == 'moufou')
FAIL check_feu_accent: returned False ('été' == 'éfétéfé')
3 checks: 3 failed
Not saved: fix feu.md and save it again.

Les checks font partie de l’identitĂ© d’une fonction, et un check qui Ă©choue empĂȘche de sauvegarder. Je corrige donc le code : une liste de groupes ordonnĂ©e par prioritĂ© (« eau », « ou », « oi »  avant « o » et « u »), puis les voyelles accentuĂ©es, puis les voyelles simples.

$ bb edit encoder_langue_du_feu@fra feu.md -m "Groupes de voyelles ordonnés, voyelles accentuées"
PASS check_feu_moi
PASS check_feu_mou
PASS check_feu_accent
3 checks: 3 passed
Parent: 5fe367ff2488ad9083034991a28db92f9be781f409adc395844a36e930bf3589
Hash: bb860da6d956ba2dfbcc6a19d7fb04a225a1a2196050ae1ea8eb5b0ffb60c268

Nouvelle logique, nouveau hash. L’ancienne version n’est pas effacĂ©e : elle est le parent de la nouvelle. Aucune des deux n’est « la vraie », ce sont deux rĂšgles du mĂȘme jeu.

Le japonais et l’arabe attendent

J’ai changĂ© la version française. Que deviennent les deux autres ?

$ bb search --outdated
Name: ŰȘŰŽÙÙŠŰ±_لŰșŰ©_Ű§Ù„Ù†Ű§Ű± (ara)
Status: ..., newer version in fra, not yet translated to ara, newer version in fra, not yet translated to jpn

Ils n’ont rien perdu et rien cassĂ© : ils restent sur leur version, et bb dit simplement qu’une traduction est attendue. Dans la v0.3, une modification dans une langue ne force personne dans les autres, elle laisse une dette visible.

Quelqu’un qui lit le japonais la paie, en donnant les noms dans sa langue. Le code ne change pas, seuls les noms changent :

$ bb translate encoder_langue_du_feu@fra jpn traduction.md
- encoder_langue_du_feu -> ç«ăźèš€è‘‰ă«ć€‰æ›
- texte -> 文章
- voyelles -> æŻéŸłäž€èŠ§
- voyelle -> æŻéŸł
...
$ bb translate encoder_langue_du_feu@fra jpn traduction.md
Translation: bb860da6d956ba2dfbcc6a19d7fb04a225a1a2196050ae1ea8eb5b0ffb60c268@jpn@6c9f9c74

Name: ç«ăźèš€è‘‰ă«ć€‰æ›@jpn

MĂȘme geste pour l’arabe. Ensuite :

$ bb search --outdated
No matches found: nothing outdated

Trois noms, un hash, et une histoire

$ bb log ç«ăźèš€è‘‰ă«ć€‰æ›@jpn
Step: 5057cc25

Translate: ç«ăźèš€è‘‰ă«ć€‰æ›@jpn bb860da6

From: ç«ăźèš€è‘‰ă«ć€‰æ›@jpn 5fe367ff


Step: 94551f4e

Translate: ç«ăźèš€è‘‰ă«ć€‰æ›@jpn 5fe367ff


Le nom japonais a maintenant deux versions, et chaque pas dit d’oĂč il vient. Les trois langues ont convergĂ© de nouveau sur bb860da6
. La convergence est dĂ©tectĂ©e, la divergence est prĂ©servĂ©e : c’est toute la promesse du projet, jouĂ©e sur un jeu d’enfants.

Ce qui change pour vous

La v0.3.0 couvre 109 commits depuis la v0.1.0. Deux ruptures : le stockage (bb migrate convertit les anciens pools) et les imports (from bb.pool import x devient import bb puis x = bb.resolve("x")). @check et bb commit ont disparu : les checks vivent dans le fichier d’édition, et partager un pool relĂšve de git. Les notes complĂštes sont sur la page de la release : https://github.com/amirouche/bb.py/releases/tag/v0.3.0

La prochaine fois, je vous apprends la langue du meuh. 🐼