ALGB
(en RPL utilisateur, pour le RPL système,
je n'ai pas écrit de documentation autre que celle du code source
de ALGB
). Lorsqu'on écrit des programmes, on
s'aperçoit rapidement qu'on perd beaucoup de temps si à chaque
instruction il est nécessaire de convertir du mode utilisateur au mode
interne et réciproquement. Par exemple, si on additionne 'X+1' et 'X+1',
l'addition en interne prend 0.2s environ, alors que les conversions
durent 0.4s. L'instruction SXL
a pour but de convertir une fois
en début de programme l'ensemble des entrées utilisateur en entrée
interne et la même instruction convertit à nouveau les données internes
au format utilisateur. Le flag 17 indique aux instructions intermédiaires
qu'il n'est pas utile de convertir les données.
Le schéma de pile est le suivant pour convertir en interne:
stk n+1: obj_n -> stk n+1: liste des variables ... -> stk n: obj_n stk 2: obj_1 -> .... stk 1: #n -> stk 1: obj_1Réciproquement, il faut mettre sur la pile la liste des profondeurs des objets symboliques, c'est-à-dire
#2h
pour une matrice, #1h
pour un vecteur et #0h
sinon:
stk n+2: liste de variables -> stk n+1: obj_n -> ... -> stk n: obj_n stk 2: obj_1 -> .... stk 1: { #pn ... #p1 } -> stk 1: obj_1
Exemple:
Le crochet de Poisson de 2 matrices est défini par:
(en mécanique quantique, c'est le symbole principal du commutateur de deux observables à près) On pourrait écrire le programme suivant:
<< @ A, B -> A*B-B*A DUP2 0 MMULT 3 ROLLD SWAP 0 MMULT SUBT >>et le sauvegarder dans la variable
POISSON
.
Si on essaie ce programme sur les deux matrices:
A = { { X 'X+1' } B = { { 'X-1' '3*X' } { 'X+2' 2 } } { 'X^2+4' 7 } }on obtient la réponse:
{ { 'X^3-2*X^2-2*X+4' '2*X^2+X+8' } { '-X^3+3*X^2-10*X-8' '-X^3+2*X^2+2*X-4' } }après 9.2s. Si on modifie le programme en:
<< #2 SXL DUP2 0 MMULT 3 ROLLD SWAP 0 MMULT SUBT { #2 } SXL >>on obtient la même réponse après 3.8s. Notez que l'argument
#2
avant le premier appel à SXL
signifie que le programme agit sur 2 arguments, alors
que la liste { #2 }
avant SXL
signifie que la réponse
est une matrice (profondeur 2) et non un polynôme ou un vecteur.
Notez que l'instruction MMULT
permet d'effectuer des produits
de différents types, selon l'argument situé au niveau 1 de la pile,
les arguments aux niveaux 2 et 3 sont: