Oui, très bien, mais toutes ces spécificités des listes n'existent pas sur la HP28S.
Faire des listes de listes, pas de problème cela se passe comme décrit ci-dessus sur HP28.
La fonction SIZE renvoie bien les mêmes valeurs.
{ A B C} SIZE retourne 3.
{ { 1 2 3 } { X Y } } SIZE retourne 2.
Par contre , l'EVALuation d'une liste retourne la même liste non modifiée :
Ainsi: { "Pomme" 25 } EVAL renvoie simplement { "Pomme" 25 }
Pour mimer le comportement des H4x/HP50, il faut utiliser la séquence
{ "Pomme" 25 } LIST-> DROP
En effet, l'instruction LIST-> (qui je crois a disparue de l'arsenal des instructions des HP4x/HP50 où seule OBJ-> est présent) retourne les éléments de la liste dans la pile (un élément par niveau de pile) et au niveau 1: le nombre d'éléments.
Ainsi { "Pomme" 25} LIST-> met "Pomme" au niveau 3:, 25 au niveau 2: et 2 au niveau 1:
Le DROP est nécessaire pour faire disparaitre ce dernier 2 (qui indique en fait le nombre d'éléments).
Les instuctions HEAD et TAIL doivent être programmées, elles n'existent pas d'origine sur les HP28C/S.
On peut par exemple utiliser les codes suivants:
Notons d’ailleurs que HEAD renvoi un
Atom (c'est-à-dire un élément d’une liste), alors que TAIL renvoi une
liste.
Quand à la fonction SORT, elle doit aussi être créée par l’utilisateur. Mais, il y a une ambiguité quand à la façon de trier, car les éléments des listes ne sont pas tous nécessairement des valeurs numériques, il peut s’agir de nombre, de symboles, de chaine de caractère, d’autres listes, etc...
Alors qu’elle est la relation d’ordre qui doit être utilisée ?
Ma question est, comment SORT évalue-t-il les
atoms d’une
Liste ? Comment fait SORT pour classer par exemple 25 et "Pomme" ?
Quand à REVLIST, c’est assez drôle à programmer :
Code : Tout sélectionner
« LIST-> -> n
« IF n 1 >
THEN
2 n FOR i
i ROLL
NEXT
END
n ->LIST
»
»
‘REVLIST’ STO
[/code]
Il existe également le moyen de récupérer ou de placer le n-ième élément d’une liste (GET et PUT), de trouver la position d’un élément (très utile car retourne 0 si l’élément n’est pas dans la liste), mais il y a aussi SUB qui permet d’extraire une partie d’une liste :
{ A B C D E F } 2 4 SUB renvoie { B C D }
Mais il y a aussi GETI et PUTI, très utiles dans une boucle DO...UNTIL...END car ces instructions permettent de pointer automatiquement sur l’élément suivant de la liste.
L’opérateur + a le même rôle et permet de concaténer les listes, ou une liste avec un atom :
{ A B C D } { 1 2 3 4 5 6 } + renvoi { A B C D 1 2 3 4 5 6 }
123456 { A B C D } + renvoi { 123456 A B C D }
{ A B C D } 123456 + renvoi { A B C D E F 123456 }
Mais là s’arrête la similitude avec les HP RPL perfectionnées, les HP28S ne permettent aucune ‘vectorialisation’ des opérandes :
{ 1 2 3 4 } SQ
{ 1 2 3 4 } 3 ^
{ 1 2 3 4 } 3 /
{ 1 2 3 4 } 3 *
Etc.
--->Provoquent tous une erreur ‘Bad Argument Type’ (type d’argument incorrect)
De même, les instructions STO+, STO*, etc ne fonctionnent pas pour les listes entières.
Par contre, l’adressage indirect fonctionne très bien en notation algébrique :
Supposons que l’on ait la liste ‘L’ suivante :
{ 10 20 30 40 50 "Lapin" } ‘L’ STO
On peut obtenir ses élément par indexation :
‘L(3)’ EVAL renvoi 30 et ‘L(6)’ EVAL renvoi "Lapin".
On peut également utiliser STO :
400 ‘L(2)’ STO remplace le second élément de la liste L par 400.
Nous avons alors L qui contient { 10 400 30 40 50 "Lapin" }
On peut ainsi rapidement construire des listes par récursivité ou par pointeurs :
’L(4)’ ‘L(5)’ STO va modifier la liste L en { 10 400 30 40 ‘L(4)’ "Lapin" }
Alors ‘L’ 5 GET EVAL et ‘L’ 4 GET EVAL pointe tous deux sur le même atom, ici 40.
Les deux séquences suivantes sont équivalentes :
L ‘L(3)’ STO
‘L’ 3 L PUT
Elles modifient toutes les deux la liste mémorisée en L en y dupliquant le contenu :
La variable L contient alors { 10 400 { 10 400 30 40 ‘L(4)’ "Lapin" } 40 ‘L(4)’ "Lapin" }
Notons enfin, que le HP28C/S ne fait pas la distinction entre un nom de variable (un label) et la référence formelle ou algébrique à cette variable.
Ainsi, dans une liste les variables ne sont jamais entre guillemets simples : sur HP28S, il est impossible de produire la liste { ‘A’ ‘B’ ‘C’ ‘D’ } qui est immédiatement représenté et interprétée comme la liste { A B C D }.
Il ya encore une ou deux subtilités concernant des listes pouvant contenir des instructions ou des fonctions. Ainsi que l’évaluation de liste donc les deux premiers (au plus) éléments sont des variables locale (dans une procédure donc). Dans ce cas, la liste servant d’argument à PUT, GET, P->R et R->P est évaluée en substituant les variables locale par leur valeur en cours d’exécution.
C’est, il me semble assez différent du comportement des listes du HP50.