Il y a un an de cela, j'avais débuté un projet nommé Ace Script. Pour diverses raisons et à cause de mon disque dur (interne) qui a rendu l'âme, j'ai perdu toute trace du projet et je n'ai pas pu le mener à terme.
En lisant le sujet de Wistaro sur son Convertisseur TI couleur/monochrome, j'ai appris qu'Adriweb avait commencé à coder un [dé]tokenizer pour calculatrices TI.
Show/Hide spoilerAfficher/Masquer le spoiler
Qu'est-ce qu'un tokenizer ?
Pour ceux qui ne connaissent pas, le tokenizer est l'outil qui va convertir le code que vous tapez sur votre ordi en format binaire. En gros, si vous tapez "Disp A+B*2", le tokenizer va transformer ce texte en caractères spéciaux illisibles par un humain. Ce format est nommé binaire et est le seul que comprennent les machines.
Le détokenizer est le programme qui va convertir un fichier binaire en texte lisible pas un humain.
Étant donné que créer un tokenizer TI est très complexe (d'autant plus qu'il ne s'agit pas seulement de convertir le texte en binaire mais aussi de rajouter certaines informations au fichier), je compte utiliser celui qu'Adriweb est en train de créer.
Pour ceux qui ne connaissent pas, le tokenizer est l'outil qui va convertir le code que vous tapez sur votre ordi en format binaire. En gros, si vous tapez "Disp A+B*2", le tokenizer va transformer ce texte en caractères spéciaux illisibles par un humain. Ce format est nommé binaire et est le seul que comprennent les machines.
Le détokenizer est le programme qui va convertir un fichier binaire en texte lisible pas un humain.
Étant donné que créer un tokenizer TI est très complexe (d'autant plus qu'il ne s'agit pas seulement de convertir le texte en binaire mais aussi de rajouter certaines informations au fichier), je compte utiliser celui qu'Adriweb est en train de créer.
L'autre jour en programmant sur ma TI je me suis dit qu'il sera quand même vachement plus simple de pouvoir définir des fonctions en TI-Basic et d'avoir quelques fonctionnalités supplémentaires pour effectuer certaines tâches.
J'ai donc décidé de créer un nouveau langage de programmation, l'UnderBasic. Pourquoi ce nom ? Eh bien tout simplement parce qu'il est converti en TI-Basic !
Ce langage permets, entre autre, de :
- Définir des fonctions
- Utiliser des variables avec des noms
- Programmer avec une syntaxe plus simple
- Avoir accès à une bibliothèque de fonctions
Mais, puisque l'UnderBasic est converti en TI-Basic, comment cela va-t-il fonctionner, me direz-vous ? En fait c'est très simple.
Prenons ce code :
- Code: Select all
nom is Str1
function direBonjour (personne) {
print("Bonjour " + personne)
}
input(nom, "Nom ? ")
direBonjour(nom)
sera converti en :
- Code: Select all
Input "Nom ?",Str1
Disp "Bonjour " + Str1
Alors certes, vu comme ça, c'est une pure perte de temps puisque le code UnderBasic est plus long et complexe que le code TI-Basic. Mais imaginez avec des programmes beaucoup plus longs... Pouvoir utiliser des variables avec de "vrais" noms et définir des fonctions serait beaucoup plus pratique !
L'UnderBasic, pour pouvoir être converti, a besoin de certaines informations. Par exemple, il ne sait pas à quoi correspond la variable nom. Il va donc falloir lui lui dire qu'elle fait référence à la variable Str1 de la calculatrice. Pour cela, on utilise l'instruction :
- Code: Select all
nom is Str1
Pour les fonctions, je ne pense pas avoir vraiment besoin d'expliquer
Sachez seulement que le compilateur est intelligent et ne se contente pas de convertir bêtement le code. Cela lui permets de comprendre que, dans le code que j'ai cité en exemple, l'argument personne fait en fait référence à la variable nom, faisant elle-même référence à Str1. En d'autre termes, lorsque le code situé dans le fonction va appeler la variable personne, le compilateur va remplacer cela par Str1.
Exemple : La suite de Fibonacci
- Code: Select all
i is A
suite is _SUITE
suite = [0, 1]
for(i, 3, 18) {
suite[i] = suite[i - 2] + suite[i - 1]
print suite[i]
}
- Code: Select all
{0, 1}->LSuite
For(A,3,18)
LSUITE(A-2)+LSUITE(A-1)->LSUITE(A)
Disp LSUITE(A)
End
N.B. : Les "L" correspondent au caractère "petit L" pour les listes en TI-Basic.
Voilà ! On voit bien que la premier code est plus lisible que le second puisqu'il est indentable et espaçable.
À noter qu'il est possible d'omettre les parenthèses lorsque l'on utilise une fonction.
Voici un aperçu des possibilités en UnderBasic :
- Code: Select all
#icon 0F2A6F542C8D2F6F
#description UnderBasic test
#import generic
explicit X,Y
explicit list map
input map, "Map : "
displayMap (map, X, Y, " +-*")
pause
- Code: Select all
:"UnderBasic test
:"0F2A6F542C8D2F6F
Input "Map : ",LMAP
ClrHome
For(Y,1,8)
For(X,1,16)
Output(Y,X,sub(" +-*", LMAP(16Y+X-16)-1,1))
End
End
Pause
Là, on voit bien que le premier code est plus simple à utiliser. Mais comment ça fonctionne ?
Une ligne commençant par un # est appelée directive.
La directive description permets d'associer une description à un programme, lisible par les Shell comme DoorsCS.
La directive icon permets d'associer une icône à un programme, lisible par les Shell comme MirageOS ou DoorsCS.
La directive import permets d'importer une bibliothèque depuis un paquet de bibliothèque. En l’occurrence, c'est la bibliothèque generic qui est importée. C'est notamment elle qui permets d'utiliser la fonction displayMap
Le mot-clé explicit indique que la variable a une référence explicite. Par exemple, explicit X signifie que, lorsque l'on utilisera la variable X, on fera bien référence à la variable X de la calculatrice.
Voilà ! Dites-moi ce que vous pensez du projet ! Si vous avez des suggestions, n'hésitez pas !