Gestion des arguments
- ENTIERS et les CHAÎNES.
les structures du BASIC ( MATRIX et LISTES ) sont supportées. Ce qui fait que la fonction s'executera en parcourant individuellement chaque élément.
pour faire court on dira EXPR simple pour désigner seulement ENTIERS ou CHAÎNES
et EXPR Complexes pour MATRIX et LISTES et EXPR pour désigner le tout.
La Syntaxe
[cite]
Le retour à la ligne c'est juste pour la lisibilité du code
Syntaxe de Base
C'est celle déjà implémentée et fonctionelle
MyLib(
"fonc1" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
"fonc2" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
...)
Syntaxe avec délimiteurs de Blocs
C'est fait..
MyLib(
"fonc1" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
{ "fonc2" [,EXPR1] [,EXPR2] ...[,EXPRN] , % , "fonc3" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
"fonc4" [,EXPR1] [,EXPR2] ...[,EXPRN] } , % ,
"fonc5" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
... )
où % remplace le symbole infini.
La seconde syntaxe vous procurera une grande aisance lors de l'utilisation des structure de contrôle 'Jump' , 'Goto' et 'Labl'
En effet il suffit d'avoir la chose suivante pour sauter un Block en entier:
MyLib(
"jump", VALEUR_TEST , OffSet , % ,
{
"pict", "#desktop","#x0" ,"#y0" ,1 , % ,
"text" , "#comment" ,"#x1" ,"#y1", 0, 1, % ,
"text" ,"#title" , "#x2" , "#y2", 0, 1
} , % ,
"text" ,"MyLib Version 1.1 ", 0,0,1)
pour VALEUR_TEST=1 et OffSet =1
le Bloc entre accollade sera sauter car il correspond au saut d'un seul argument de fonction.
par souci de conformité avec l'implémentation actuelle je mettrai la fonction "Bloc",{Liste_contenant_du_code} , % , .....
[cite]
Interpretation des Arguments
List désigne une Liste
Elt désigne un NUM|STR
-> désigne le symbole de STO
Appel Standard
MyLib("fonction" , {List1,List2} , { Elt1, Elt2} , Elt0)
- les paramètres non LIST|MATRICE reste inchangés
- à tout élément de List1 correspond Elt1
- à tout élément de List2 correspond Elt2
Le principe c'est que le dernier élément d'un argument est répété pour les autres arguments.
Attention dans le cas des MATRIX le Dernier argument est une Liste.
Forcer le déplacement d'une Liste et le Mettre en Mode Auto-Reapeat
MyLib("fonction" , {List1,List2} ,"->" , { Elt1, Elt2} , Elt0)
"->" n'a aucun effet sur les MATRIX (faut pas tenter le DIABLE et en plus je ne vois pas à quoi ça pourrait servir)
"->" force l'avancement des élément de la Liste , { Elt1, Elt2} ; et se repositionne au début de la liste autant de fois qu'il faut pour parcourir de tous éléments de la MATRIX {List1,List2}
A la place de la MATRIX {List1,List2} il y aurait pu avoir une LISTE { Elta, Eltb, Eltc, Eltd, Elte, Eltf } .
la Liste { Elt1, Elt2} aurait alors été parcourue 3 fois.
Arguments Optionnels
Lorsque les arguments d'une fonction sont omis, les valeur par défaut sont :
- zéro pour les NUMERIQUE
- chaîne vide pour les STRING
Les arguments par valeur
vous pouvez passer directement une EXPR.
Mais il est préférable d'utiliser une indirection vers une variable TiOS.
Une raison simple à cela : vous surcharger la Pile d'expressin de la TI.
Les arguments par valeurs ne sont utilisé que pour passer des variables Globales Statiques et surtout des EXPR simples.
De plus Stockez toujours vos variables globales dans des Variable TI BASIC d'abord.
ça facilite la Maintenance du Prog.
Entre ces 2 formes :
1->lbl1:MyLib("Goto", lbl1, ............. , "Labl",lbl1, ..........., "Goto", lbl1, ................,"Goto", lbl1 )
MyLib("Goto", 1, ............. , "Labl",1, ..........., "Goto", 1, ................,"Goto", 1 )
la modification du numéro du "Labl" est plus simple dans le 1er code et fastudieux dans le 2nd
Les arguments par indirection
Pourquoi les indirections ? je dirai 3 raisons évidentes :
1- ne pas surcharger la PILE(ESTACK) de la TI.
[cite]
En effet tout le code de MyLib y sera copié pendant l'execution du prog.
Alors priviliégiez sytématiquement :
- les codes de programme dans les Listes
- l'usage des indirections internes
L'exécution du code n'en sera que plus rapide.
[cite]
2- Empêcher le TiOS d'évaluer des variables dont la valeur n'est pas encore définie au moment ou le TiOS copie le Code de 'MyLib' dans l'ESTACK.
3- Les variables (qui par définition ne sont pas constante) modifié par le code et réutilisées par la suite
-"#" désigne le dernier argument posé sur la pile_interne
- "#0" à "#9" un Tableau de STRUCTURES internes du C alloué dynamiquement
- pour le basic : "#nomvariable" ("#nomvar" équivaut à nomvar : le contenu de la variable n'est pas dans la pile (seulement la chaine) ; le TiOS n'analyse que la Chaine (pas la Variable) alors que MyLib regardera dans la Variable)
L'utilité des STRUCTURES internes est avérée dans les boucles. Histoire de ne pas parcourir de nouveau la l'ESTACK. ça sert à faire afficher du texte beaucoup plus vite
qu'avec des Listes ou Matrix par expemple.
Les Indirections dans la pile interne "#" .
Cela donne de la souplesse au language et permet d'effectuer le passage d'arguments à un autre programme ou entre les fonctions de la 'MyLiB'. En fait cela permet de rediriger l'argument de la fonction dans la pile interne de MyLib en remontant une EXPR après l'autre.
Vous ne pouvez pas en mettre à l'intérieur des Liste ou des MATRIX , car elle remplacera la LISTE ou La MATRIX par l'argument de la pile.
Les Indirections retardées cachées dans les Listes
On parle d'indirection retardée lorsque celle-ci n'est pas visible lors du passage d'arguments à une fonction.
Ces indirections ne peuvent porter que sur des variables de type NUM|STR .
Vous écrivez {"#a" , "#b" } au lieu de { a, b }
Limitations Actuelles : Presque Rien
- 5 structures internes Global à la LIB
- Nombre de programmes
- Définition de la Profondeur de La pile des appels de programme.
- Récursivité : c'est possible selon la profondeur que vous définissez.
- Pas d'imbrication de définiton de programme.
- Le "prog",0 est celui qui est actif quand on lance la MyLib
- Nombre de labels défini par un paramètre du programme appelant
- Nombre de compteurs internes défini par un paramètre du programme appelant
- Taille Maxi des chaînes 255 caractères(ça passera à 1000 si je décide de réintégrer les fonctions de manipulation de chaine déjà écrite : left, right,len,mid,scat[addition de chaîne] ).
- Les chaînes sont allouées dynamiquement à leur taille réelle dans les structures internes.
Plus Conversion des EXPR Basic en Fichiers Externes
Seulement un chargement en STRUCTURE interne.
J'arrive pas encore à trouver une application à ces STRUCTURES internes mais ça va venir.(Bien sure ç ser déjà pour le CATALOG like Complete)
En effet elle sont pour le moment imcompatible avec mes pointeurs sur l'estack;
Va falloir que j'associe une petite structure pour pointer dedans comme je l'aurais fait avec les Listes ou Matrix.