# TI-Basic

TI-Basic est le nom du langage de programmation des calculatrices graphiques Texas Instruments (Depuis lors remplacé officiellement par le langage Python sur les derniers modèles).
Par sa philosophie et ses capacités, ce langage se rapproche du BASIC, d'où son nom. Cependant, sa syntaxe est substantiellement différente de celle du BASIC. Le TI-Basic des calculatrices basées sur le Motorola 68000 (« 68 K ») (TI89) n'est pas le même que celui des calculatrices basées sur le Z80 (TI-83,TI-84). Chaque modèle de calculatrice dispose de fonctionnalités particulières exploitables par les programmes, mais le cœur du langage est commun.
Selon les modèles de calculatrices, les instructions peuvent être soit choisies dans des menus, soit tapées en toutes lettres sur un clavier alphanumérique. Dans le premier cas, aucune phase de lexémisation n'est nécessaire, et le programme est directement stocké sous une forme de bytecode. Dans le second cas, une lexémisation est effectuée lors de la première exécution qui suit une modification. Dans tous les cas, l'interprète proprement dit travaille sur le bytecode.

## Description succincte du langage
### Types de données

Les variables utilisables sont celles accessibles depuis les écrans de calcul. Par exemple, dans le cas de la TI-82 :
* les nombres à virgule flottante ;
* les matrices ;
* les listes de nombres ;
* les fonctions de graphes ;
* les variables système ;
* les tableaux de données.
La TI-82 ne permet pas le stockage et la manipulation d'autres types de données, comme les chaînes de caractères. Il est uniquement possible d'afficher des chaînes. Les variables de type chaîne sont apparues sur des modèles plus récents.
Le TI-Basic est un langage à typage fort, en considérant qu'il n'est pas possible de modifier ou de choisir le type de valeurs des variables. Les variables sont globales et n'ont pas besoin d'être déclarées avant d'être utilisées dans une expression.

### Syntaxe

Sur les calculatrices à base de Z80, les programmes ne sont pas saisis sous forme alphanumérique, mais via les menus de la calculatrice. Les lettres quant à elles représentent toujours des variables numériques, le produit étant implicite. Ainsi, les lettres « FOR » tapées l'une après l'autre ne désignent pas le début d'une boucle, mais les produits de variables F, O et R. Une expression se termine par un double-point.
Les commandes de contrôle et de boucle doivent être terminées à l'aide du mot-clef End, qui sert de marqueur de fin de bloc (de la même façon que l'accolade fermante dans les langages de la famille du C).
Comme pour les autres erreurs, les erreurs de syntaxe provoquent l'arrêt du programme avec un message d'erreur.

#### Contrôles

Le TI-Basic supporte les concepts fondamentaux de contrôle, à savoir :
* l'affectation avec la flèche orientée à droite (→) : l'expression située à gauche de la flèche est évaluée, et le résultat est rangé dans la variable située à droite ;
* les instructions de branchements conditionnels If, Then, Else, EndIf ;
* les boucles : While (Z80), Repeat (Z80) ou Loop (68K), For ;
* les branchements, avec l'instruction Goto et les étiquettes désignées par Lbl. De plus, une commande Menu (Z80) ou ToolBar (68K) permet d'afficher un menu d'options, chacune effectuant un branchement vers une étiquette spécifiée.

#### Entrées/Sorties

Les instructions d'entrées/sorties sont :
* Input et Prompt, afin de demander à l'utilisateur de taper une valeur à affecter à une variable ;
* Output, afin d'afficher une variable ou une chaîne à un emplacement de l'écran, contrairement à la suivante ;
* Disp, qui ne permet que de sortir une variable dans le flux de l'écran principal ;
* DispGraph, DispTable, qui affichent le graphe ou la table courante ;
* Input permet également de récupérer les coordonnées du curseur affiché à l'écran ;
* ClrHome, ClrTable, qui effacent l'écran principal ou la table courante ;
* PrintScreen(z80), imprime l'écran courant sur un périphérique externe si connecté ;
* Get et Send auxquels s'ajoutent GetCalc et SendCalc sur 68K et SendChat pour nouvelles 68K; ils exportent ou importent une variable depuis un dispositif externe (une autre machine) ;
* getKey permet enfin d'obtenir le code (scancode) correspondant à la dernière touche pressée.

#### Création de fonctions et programmes

Dans les calculatrices basées sur le Motorola 68000, une fonction ou un programme peut être créé directement en utilisant la fonction Define, sa syntaxe est :
Ceci peut être utilisé à l'intérieur d'une autre fonction et implémente ainsi des fonctions et programmes locaux.
Dans les calculatrices basées sur le Z80, ceci est impossible. La seule possibilité est d'appeler d'autres programmes enregistrés sur la machine, et ceux-ci ne prennent pas d'arguments : tout passage de valeur se fait via les variables globales.
Une stratégie possible pour simuler l'appel de fonction, prenant un ou plusieurs arguments, et renvoyant une ou plusieurs valeurs est la suivante : étant donné un programme PrgmA, on souhaite appeler un programme PrgmB, on peut écrire :
Ans représente la valeur de la dernière expression calculée.
Le programme PrgmB peut alors avoir la forme suivante :
L'intérêt de cette méthode est néanmoins limité, étant donné que toutes les variables sont globales.

#### Divers

Les nombreuses fonctions mathématiques sont disponibles dans les instructions des diverses machines.
Il est possible d'échanger des programmes en reliant deux calculatrices par câble, ou encore en reliant la calculatrice à un ordinateur ; ceci permettant aussi d'avoir recours à un émulateur sur ordinateur afin de faciliter la frappe et la mise au point d'un programme.

## Exemples de programmes
### Hello world

Le mot-clef Disp permet d'afficher le traditionnel Hello world à l'écran :
Mais l'on peut aussi utiliser une autre fonction, qui affichera Hello world aux coordonnées définies par X et Y (coordonnées en pixels pour les TI-89 ou supérieurs, en ligne/colonnes de caractères pour les plus anciennes) :
Remarque : les programmes en Ti-Basic n'effectuant qu'une instruction par ligne, les deux exemples précédents sont simplifiables respectivement en :
Il est important de préciser que la dernière ligne n'est pas une erreur : en effet l’interpréteur du TI-Basic accepte que des commandes ne soient pas parfaitement bien parenthésées; et il s'agit donc d'une optimisation commune que ne pas écrire les guillemets et les parenthèses en fin de ligne.
La seule faiblesse connue de cette optimisation se rencontre lorsqu'une commande finit par un guillemet, omis, et que la ligne suivante commence par un Lbl[0-9].

### Carré d'un nombre

Pour faire un programme qui affiche le carré d'un nombre, il faut :
* entrer le nombre, avec l'instruction Input qui admet en premier argument le message d'invite et en second le nom de la variable qui va recevoir le nombre :
:Input "A =",A
* calculer le carré, grâce à la touche ² et assigner ce résultat à une variable (facultatif) avec la touche sto → :
:A²→R
* afficher le nombre, avec l'instruction Disp qui affiche un argument par ligne :
:Disp "A² =",R
Les instructions Input et Disp se trouvent dans le sous-menu I/O en appuyant sur PRGM durant l'édition du programme.

### Jeu du pile ou face

Ce programme est un jeu qui simule plusieurs fois le lancer d'une pièce. Elle retombe soit sur le côté pile, soit sur le côté face. Il montre comment utiliser la fonction de génération d'entier aléatoire, autrement dit randInt(. Notez que ce programme est la racine du jeu, il est ensuite possible d'y ajouter des fonctionnalités.
NB : Si la commande Menu( n'est pas disponible, il est possible d'utiliser :

### Trouver les diviseurs d'un nombre (dans ℕ)

Ce programme permet de trouver les diviseurs d'un nombre. Il montre plusieurs structures essentielles de la programmation TI-Basic. Il stocke ces diviseurs dans une liste L1 qu'il affiche en fin d'exécution.
NB : Il est inutile de tester tous les nombres de 1 à N, on peut se contenter d'aller jusque N/2, ou mieux ${\sqrt {N}}$, (Il ne faut alors pas oublier de mettre N, qui est un diviseur, dans la liste)

### Trouver les racines réelles d'une fonction trinôme

Ce programme permet de trouver les racines réelles d'une fonction du second degré. Il effectue le calcul du discriminant et, en fonction de celui-ci, il calcule la ou les éventuelles racines.

## Sources

* Manuel d'utilisation de la TI-82.