URL: https://linuxfr.org/users/chimrod/journaux/licht-0-1 Title: Licht 0.1 Authors: chimrod Date: 2018年02月13日T15:07:12+01:00 License: CC By-SA Tags: libreoffice et openoffice Score: 49 Bonjour à tous, j'ouvre aujourd'hui un journal pour vous présenter licht, un tableur en console. # Licht # C'est la première version que je diffuse, et après plus d'un an passé sur le programme, je me rends compte que je n'ai pas grand-chose d'aguicheur à vendre : - ça utilise l'interface sexy de ncurse, - la prise en charge des fichiers openOffice est basique, - le nombre de fonctions disponibles restent limitées. En gros, ça suffit pour faire des petits calculs sans charger sa mémoire, mais il ne faut pas s'attendre à quelque chose de révolutionnaire. C'est d'ailleurs pour cela qu'il s'agit d'une version 0.1 : c'est une version minimale propose un minimum de fonction, mais qui est censé fonctionner. J'avais commencé à écrire licht suite à un article dans un vieux GLMF, sur un tableur écrit en C en 200 lignes de codes. Ça avait l'air assez simple, et j'ai essayé de m'y mettre. Résultat des courses, après plus d'un an de temps libre passer à coder, je n'ai pas encore la totalité des fonctionnalités présentées dans ces deux pages (pas de camemberts, pas de graphiques) : je crois que j'ai dû me louper quelque part... À la place, j'ai un système de typage, un catalogue dynamique de fonctions (que je compte utiliser plus tard pour mettre en place un système de plugins), une gestion (partielle) des fichiers open document en lecture et écriture et surtout j'ai appris plein de trucs ! - Calculer des [[jour julien]] - Comment me servir des GADTs en OCaml pour écrire un système de typage - Écrire des grammaires (pour lire les saisies des utilisateurs, ou les formules stockées dans libreOffice) - Des [arbres splays](https://en.wikipedia.org/wiki/Splay_tree) (qui me fascinaient depuis ma lecture d'Okasaki), - Et j'ai également eu l'occasion de réfléchir à ce qu'est un tableur (mais j'y reviendrai un peu plus loin). Je suis content du code (qui n'est pas parfait, mais qui est assez organisé pour que j'ose le montrer), et j'ai pris plaisir à l'écrire, ce qui est l'essentiel (-: Maintenant si d'autres personnes trouve un intérêt, que ça soit dans l'utilisation ou dans le code, n'hésitez pas à m'en faire part, ça me fera plaisir ! ## Installation ## Le plus simple pour l'installation est de passer par `opam` : ```console # sudo aptitude install opam libncures-dev libiconv-dev libgmp-dev zlib1g-dev $ opam pin add -k git licht http://git.chimrod.com/cgit.cgi/licht.git ``` Vous pourrez ensuite lancer `licht` accompagné ou non d'un fichier ods en paramètre. ## Utilisation ## Vous trouverez sur la page du projet [une petite description](http://git.chimrod.com/cgit.cgi/licht.git/about/) de ce que l'on peut faire avec. *Attention !* J'ai dit que le support des fichiers ods était basique, aussi, je vous déconseille de réécrire un fichier ouvert : le fichier est complètement réécrit, et toutes les fonctions non gérées seront perdues (formatage, etc) # Réflexions sur les tableurs # Alors comme je n'ai pas grand-chose à dire sur ce que j'ai produit, je vais enrichir mon journal en présentant des choses que je n'ai pas écrites. Pour commencer, je vais vous présenter mes voisins. ## SC l'ancètre ## [sc](https://en.wikipedia.org/wiki/Sc_(spreadsheet_calculator)) est un tableur en console qui fourni les fonctions de base. Il offre même le luxe de pouvoir aligner le texte. Il présente l'avantage de pouvoir sauvegarder ses fichiers dans un format texte, qui présente chaque formule comme une affectation. Le programme trouverait ses origines en 1987, ce qui en fait une antiquité. Malheureusement, je n'ai pas réussi à retrouver les sources datant de cette époque. En termes de fonctionnalités, on a l'impression que ça n'a pas beaucoup évolué depuis, l'interface sobre en noir et blanc résume ce que l'on peut faire avec l'application. On ne lui jettera toutefois pas la pierre, à part le fait de mélanger le formatage avec le contenu de la cellule, il a surtout le défaut de ne pas être connu ! ## SC-IM la continuité ## scim est à sc ce que vim est à vim : une continuité et une avancée. Il propose de la couleur, une interaction avec gnuplot, et le prise en charge des formats excels. Regardez la page du [projet](https://github.com/andmarti1424/sc-im) qui est assez alléchante ! Une belle attention a été portée aux fonctionnalités de l'ihm ce qui le rend assez intéressant. J'avais testé un peu avant de commencer à coder licht, et le projet était encore un peu jeune. Il semble avoir bien muri si l'on en croit les changements qui ont eu lieu depuis. Dans les points négatifs, je citerai une gestion incompréhensible des copier/coller (en tout cas pour moi), et s'être concentré sur le format xslx plutôt que ods. ## LibreOffice ## Le mastodonte des tableurs, je le cite ici car il est communément utilisé par tout le monde. Je m'en suis servi de référence quand je me posais des questions existentielles en écrivant licht. C'est la référence pour la liste des fonctions disponibles, et d'outils pour analyser et mettre en forme les données (y compris les fameux *tableaux croisés dynamiques* que ma femme aimerait me voir implémenter dans licht !). Il s'offre également le luxe d'internationaliser le nom des fonctions disponibles (même si cela m'a toujours plus perturbé que simplifié la vie). Et je l'ai utilisé pour tester le comportement du tableur sur quelques cas limites, ce qui m'a permit de tomber sur des incohérences... Allez ? Bon, je vous explique en deux mots : [covariance et contravariance](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)). C'est plus clair ? Là je vois les experts du typage qui lèvent les yeux en disant : « mais qu'est ce que ça vient faire dans un tableur ? » Ok, allons y pour la version longue : quand on construit une liste d'éléments, il faut que toutes les valeurs soient du même type. Le problème se pose avec les date, car elles sont gérées en interne comme des nombres. Quel est donc le résultat d'une fonction qui mélange des dates et des nombres, par exemple `SUM(A1:A2)` ? Et bien avec LO, selon le type de la dernière valeur, nous pourrons avoir un résultat sous forme de date ou de nombre... Fichtre ! (Pour ma part, fait le choix que la date étant un format plus spécialisé que le nombre, il est avait une priorité plus importante, si vous avez une solution plus élégante, je suis preneur !) ## Les manques ## Bon, je ne vais pas lister tous les tableurs existants, Wikipédia fera ça mieux que moi. Je voudrai revenir sur ce que devrait être un tableur. Vraiment. Pas sûr ce qu'il faudrait ajouter pour avoir le truc à la mode, mais ce qu'il faut pour qu'un tableur redevienne ce qu'il est censé être : un éditeur de formules. J'ai cité ci-dessus le problème de la covariance et la contravariance qui est un sujet que l'on retrouve dans la programmation, essayons d'aller plus loin et voir ce qui manque vraiment pour qu'une feuille de calcul soit capable de faire vraiment des calculs (en mode Oulipo, parce qu'on peut écrire ses calculs dans tous les sens) Pour vous guider dans mon raisonnement, je vais partir de la formule ci-dessous : $$P(x) \times f(y) + (1 - P(x)) \times g(z)$$ À première vue, il s'agit d'une formule toute simple composée d'additions et de multiplications. En fait, si la fonction `P` (pour Prédicat) renvoie 1 ou 0, alors cette formule et la version mathématique du code ci-dessous : ```C if (P(x)) { f(y); } else { g(z); } ``` C'est d'ailleurs pour cela que la fonction IF (ou SI en version francisée) est disponible dans les tableurs évolués : il s'agit bien d'une formule déguisée. En travaillant simplement sur des formules mathématiques, il est possible d'exprimer des concepts que l'on retrouve dans les langages informatiques (la réciproque n'est cependant pas vrai) Malheureusement, aucun tableur ne permet aujourd'hui de saisir de telles formules. Des fonctions sont disponibles pour pallier ce manque, mais certaines fonctions sortent du cadre de ce qu'un tableur devrait proposer (même si cela permet de transformer un tableur en une [machine de turing](http://www.felienne.com/archives/2974)) J'avoue ne pas trop maitriser le domaine de la calculabilité, et j'ouvre juste le sujet en laissant la porte ouverte. # Le futur # J'ai envie de continuer à travailler le côté *formule*. Je ne cherche pas la parfaite compatibilité avec les fichiers LibreOffice (mais je suis preneur de toute contribution qui irait dans ce sens, que ça soit pour enrichir le catalogue des fonctions existantes, ou pour une meilleur intégration du format), et proposer un format un format incompatible ne me gêne pas. Sans changer la syntaxe en profondeur, je pense qu'il est possible d'écrire des formules telles que : ```python A1(x; y; z) = (x + y) / z A2 = A1(1; 2; 3) ``` c'est à dire laisser l'utilisateur composer lui même ses propres formules et pouvoir enrichir le catalogue de fonctions présenté par défaut. Dans l'idéal, toute [[fonction élémentaire]] devrait ainsi pouvoir être saisie directement. Le tableur pourrait proposer la fonction `SOMME` et `PRODUIT` qui permet de calculer, non pas la somme d'une liste d'élément (`SUM(A1:D6)`), mais la fonction telle qu'on la retrouve en mathématique : $$\sum _{i\mathop {=} 1}^{99}A1(i)$$ que l'on pourrait coder comme la fonction : `B2=SUM(1; 99; A1(_))` Avec cette simple évolution, on devrait être capable d'écrire une formule capable de calculer la nième décimale de pi, ou le nième nombre premier, si vous voulez prendre un peu d'avance sur la prochaine version, vous pouvez en discuter dans les commentaires (-; J'ai également parlé de plugins, et c'est un point que j'ai envie d'ajouter rapidement, pour pouvoir ajouter des fonctions spécifiques qui ne rentrent pas dans le module standard. Le code pour écrire une nouvelle fonction est [assez simple](http://git.chimrod.com/cgit.cgi/licht.git/tree/src/functions.ml#n134), et donc peut être facilement enrichi. Je pense que je vais commencer par coder les jets de dés. Et après ? Bah je ne sais pas. Je suis en train de quitter mon poste actuel vers un autre dans lequel je lâche complètement la technique, et ne sais pas trop quel sera mon emploi du temps dans les mois à venir. Cette première version est donc une manière de mettre au propre les *à côtés* sur lesquels je travaille (et une manière aussi de répondre à ma femme qui n'arrête pas de me dire « tu fais toujours plein de choses sur l'ordinateur, mais ça serait bien qu'on voit un peu le résultat ») ! Je me suis fait plaisir en codant, et envie d'explorer d'autres horizons, j'espère avoir réussi un peu à transmettre tout ça dans ce journal. J'apprends, comme nous tous, tout les jours, et cette annonce est aussi l'occasion d'avoir des retours, ou d'autres pistes qui peuvent venir s'intégrer dans cette réflexion sur les tableurs. La discussion est ouverte, c'est maintenant à vous !

AltStyle によって変換されたページ (->オリジナル) /