Programmer en RPL

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

C.Ret a écrit :Ca ne fonctionne pas sur la HP-28C/S, n'empêche que ces possibilités de traitement de liste sont bien les dignes descendantes du concept de traitemetn d'objets et de listes d'objets.

:tongue:
Oui, et cela pourrait être encore amélioré je pense. ;D y compris coté interface (graphique ? multi-pile ?) ...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Outre les améliorations majeures, comme celles envigasée par Gille59, il pourrait y avoir simplement d'avoir un clavier moins encombré et un écran plus large !

En fait, j'utilise depuis peu l'émulateur Emu48 de Christoph Giesselink et Sébastien Carlier. Je ne sais pas si c'est à cause du fait que se ne soit qu'un émulateur sur PC, mais j'ai encore beaucoup de mal avec le clavier, et surtout la saisie Alphanumérique.

Deux touches préfixes (plus le mode alpha) c'est trop pour un utilisateur conditionné par des années de pratique de la 28S ! En plus, et surtout, il manque l'indication claire du type de saisie (direct, algébrique et alpha). Sur la HP-28S, le curseur change de forme et de "couleur" selon ces modes. Et je suis un peu perdu avec la 50 ! C'est pas clair si l'on est en execusion immédiate, algébrique ou en saisie alpha. En fait tout ce passe comme si l'on était toujours en saisie de commande (saisie alph, mais pas au sens alphénumrique comme saisie alpha de la 50, au sens opération différée comme sur les 28).

En fait je suis constament en train de chercher les touches INS et DEL.

Ensuite, l'écran en mieux qu'une HP28S, surtout du point de vue de la hauteur. Mais curieusement, il est trop étroit, d'autant plus que l'engin peut traiter de grand nombres de plus de 16 chiffres. Alors très vite c'est un peu frustrant de ne jamais avoir la fin des nombres complexes ou des résultats complexes.

Heueusement il y a une instruction VIEW (comme sur la HP41 !).

Ce que je ne m'explique pas, pourquoi cette limitation, qui dans l'absolue est pire sur une HP28S ne m'a jamais gènée autant que sur la HP50 ? ?

Donc, pour moi, la version suivante d'une HP-50g, devrais être quelque chose un écran plus grand, qui se replie sur soi-même comme une HP28S et propose un clavier étandu permettant la saisie numérique et alpha plus facile.

Un ThinkPad en petit, un peu du format du truc à droite de cette HP48: mais en noir (ou brun foncé) avec un clavier de calculatrice (touche num, 4 opération, touche ENTER^ et STO etc.

Image
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Je suis OK sur la résolution trop limitée de l'écran mais il y a des astuces :

- Sur la 50, je travaille exclusivement en mode "small font"soit des lignes de 32 caractères. (MODE DISP et cocher tout Small...)
- Concernant le "VIEW". As tu essayé de juste faire "fleche basse" ? ca lance l'éditeur le plus adapté à l'objet sur la pile (editeur de matrice, d'équation, de texte, d'image ...) avec le scroll qui va bien etc. Au passage l'éditeur d'équation de la 50 est excellent je trouve.
- "Alors très vite c'est un peu frustrant de ne jamais avoir la fin des nombres complexes ou des résultats complexes." : il y a une option pour que le niveau 1 de la pile soit multi-ligne ( MODE DISP et décocher textbook). Les complexes apparaitront complétement même en grosse police sur 2 lignes si nécessaire (mais pas les entier longs par contre).Mais en mode "small font" pas besoin de cela

Mais l'amélioration que j'attends le plus sur une future 50, c'est un afficheur meilleur, c'est sur !.

EDIT :le pb de la calc qui s'ouvre en 'porte feuille' c'est qut tu ne peux travailler que sur une table et pas la tenir d'une main... enfin il me semble car j'en ai jamais utilisé...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Merci pour le multi-ligne du level 1: ! L'option identique à celle des 28 est un peu enfouie dans la multitude des Flags de la 50.
C'est effectivement bien plus pratique et lisible, même en gardant les caractères Font-8.

Il faut reconnaitre qu'il y a une multitude de détail et astuces forts pratiques à l'usage car ils viennent combler le manque des touches VIEW_UP et VIEW_DOWN et CURSOR qui sur les HP28 permettent de naviguer dans les lignes de données et faire disparaitre le 'soft-menu' (ce qui est for apréciable étant donné le nombre limite de ligne affiché à l'écran)


Concernant la remarque des calculettes s'ouvrant comme un livre, c'est vrai que la pluart ne permettent pas un usage dans une seule main. L'HP28 fait exception car sa charnière est double et elle permet donc d'ascamoter complètement le clavier alpha en dessous de la partie ecran + clavier numérique. Le rebord un peu disgracieux de cette partie évite justement que les touches ne touche la surface sur laquelle on pose la calculatrice.

Elle a alors sensiblement l'encombrement d'une HP41C et peut être tenue dans une main et utilisée par l'autre. A condition de ne pas avoir besoin du clavier alphabétique, cela permet une utilisation convenable.
crethp28s41c3.jpg
crethp28s41c3.jpg (203.95 Kio) Vu 2166 fois
Il faut reconnaitre que ces détails spécifiques des HP28C/S et HP18 produisent un design assez surprenant et pas nécessairement très esthétique.
Modifié en dernier par C.Ret le 24 mars 2022 00:23, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Bien vu le clavier qui se retourne complétement pour la 28 !

Mais de toute façon les rumeurs de nouvelles HP pour juin ne se sont pas confirmées.. La nouveauté est la WP 34s !
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Programmer en RPL

Message par gege »

Gilles59 a écrit :Je déterre ce topic pour préciser un peu le traitement de liste en RPL (48G et plus ?) et une technique tres pratique pour généner des sous listes d'une liste. testé sur 50G.
<SNIP>
43 octets donc ...
Sujet fort intéressant ; utiliser des primitives de la machine au lieu de boucles est clairement une bonne idée.
Cependant, j'ai l'impression qu'à un moment tu te retrouves avec 4 listes de la taille de celle entrée au début sur la pile. Ca consomme... alors certes 43 octets de programme, mais "il faudrait" aussi penser à l'utilisation mémoire des données.
Dans le genre de sujet que tu abordes, il est clair que les listes doivent être "grosses".
Donc, peut-on faire pareil avec un maximum de 3 listes à un instant donné seulement ? 2 ??
(je n'en sais rien)

G.E.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

gege a bien raison, il n'y a que 48 octet de commandes. Evidemment, il y a bien plus d'octet de données qui de plus se répète au cours des manipulations.

Code : Tout sélectionner

Commandes        @ Données (Stack)        MEM      Remarques
---------        -----------------------  -------  ------------------------------------------
                 1:{ 8 4 3 7 2 9 5 6 1 }  10 ele.    
SORT             1:{ 1 2 3 4 5 6 7 8 9 }  10 ele.  @ Tri la liste

                 2:{ 1 2 3 4 5 6 7 8 9 }
  DUP 2 MOD      1:{ 1 0 1 0 1 0 1 0 1 }  20 ele.  @ Génére la liste boolenne des pairs et impairs

                 4:{ 1 2 3 4 5 6 7 8 9 }
                 3:{ 1 0 1 0 1 0 1 0 1 }
                 2:{ 1 2 3 4 5 6 7 8 9 }
  DUP2           1:{ 1 0 1 0 1 0 1 0 1 }  40 ele. @ Duplique les 2 éléments à la base de la pile

                 3:{ 1 2 3 4 5 6 7 8 9 }
                 2:{ 1 0 1 0 1 0 1 0 1 }
  SWAP IFT       1:{ 1 3 5 7 9 }          25 ele. @ Génére la liste triée des impairs

                 3:{ 1 3 5 7 9 }
                 2:{ 1 2 3 4 5 6 7 8 9 }
  UNROT NOT      1:{ 0 1 0 1 0 1 0 1 0 }  25 ele. @ Non logique de la liste pair/impaire

                 1:{ 1 3 5 7 9 }
  SWAP IFT       2:{ 2 4 6 8 }            10 ele. @ Génère la liste des pairs

  +              1:{ 1 2 3 4 5 6 7 8 9 }  10 ele. @ concanéte les 2 listes

Cela me rappèle l'opposition entre les algorithmes dit 'en place' et ceux fesant appel à des ressources mémoires supplèmentaires.

Les algorithmes avec boucles ont généralement l'intérêt de faire les calculs ou réarrangement 'en place'. C'est donc bien plus d'octet de commande, mais au moins, on est sûr de ne pas manquer de ressource mémoire une fois les données chargées.

Sur les système micro et mini, un autre aspect interressant est le volume de données à transférer entre les unité processeur(s) et le support de masse (disk - mémoire distante ?).

Cette petite discussion qui parait anodine, résume bien les 30-40 ans d'évolution de l'informatique !

Concernant le RPL, on peut aussi limiter la mémoire des donnée en mémorisant la liste triée, puis en utilisant des apels indirect :

Code : Tout sélectionner

Commandes        @ Données (Stack)        MEM      Remarques
---------        -----------------------  -------  ------------------------------------------
                 1:{ 8 4 3 7 2 9 5 6 1 }  10 ele.
   
SORT             1:{ 1 2 3 4 5 6 7 8 9 }  10 ele.  @ Tri la liste

'L' STO          1:                        O ele.  @ Plus rien dans la pile ! Mais en mémoire un registre de 10 ele.

'L' 2 MOD        1:              L MOD 2   ? ele.  @ Génére la liste boolenne des pairs et impairs

'P' STO          1:                        O ele.  @ Plus rien dans la pile ! Mais en mémoire 2 registres de 10 ele.

P L IFT          1:{ 1 3 5 7 9 }           5 ele.  @ Génére la liste triée des impairs

                 2:{ 1 3 5 7 9 }
P NOT L IFT      1:{ 2 4 6 8 }            10 ele. @ Génère la liste des pairs

  +              1:{ 1 2 3 4 5 6 7 8 9 }  10 ele. @ concanéte les 2 listes
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

En fait le fonctionnement de la pile est plus subtil que vous ne le pensez...

Sachant que x MAKESTR est une commande qui créée une chaine bidon de taille x, voyons ce que donne :

Code : Tout sélectionner


MEM              @ (1) Mémoire dispo
100000 MAKESTR   @ Créer une chaine 'bidon' de 100.000 caractères (octets)
MEM              @ (2) Mémoire restante 
OVER             @ On duplique les 100.000 car           
MEM              @ (3) Combien reste-t-il ?
OVER DUP DUP DUP @ On duplique encore 4 fois les 100.000 car. (600.000 car en tout)
MEM              @ (4) reste ?

@ (1) MEM = 23653.5  octets libres
@ (2) MEM = 136227   octets, donc l'objet prends 100026.5 octets
@ (3) MEM = 136208.5 octets soit 18,5 octets de plus
@ (4) MEM = 136182.5 octets soit 26 octets de plus seulement 
Autrement dit toutes les commandes de pile fonctionnent via des pointeurs. DUP ne duplique pas le contenu, il duplique l'adresse qui pointe sur le contenu. Si je modifie le contenu, bien sur un nouvel objet est crée (mais l'ancien est éventuellement détruit).
Idem pour SWAP, swapper le contenu de liste de 1000 objets est instantané car c'est le pointeur qui 'swappe' pas le contenu.

Ainsi la séquence
50000 MAKESTR
50000 NDUPN @ duplique n fois la base de la pile et retourne n

ne prend heureusement pas 2,3 Go de RAM et est exécutée sans pb et quasi instantanément.

Ce qui veut dire que dans la présentation de C.RET qui détaille bien ce qui se passe (sauf le résultat du + final ;) ), au moment du DUP2, il n'y pas pas 40 éléments en mémoire,mais toujours 20 + 2 pointeurs de quelques octets (même si les liste faisaient 1000 éléments çà ne change rien aux quelques octets de +)

L'expérience montre aussi que les manip de listes via DOSUB et autres sont bien plus rapides que des boucles explicites.

Sur la 50, il est tout a fait possible d'utiliser la carte SD comme "mémoire de masse", autant dire que la mémoire est illlimité dans ce cas (par rapport au type d'usage) puisqu'il existe des SD de 2Go....

EDIT : concernant la vitesse, pour une liste de 100 nombres (réels), çà met 2, 7 sec.dont pas mal dans le tri je pense ...

Pour 1000 nombre, 48,9 sec dont 29,3s pour le seul tri (on a sans doute intérêt à trier 2 fois d'ailleurs - impair et pair plutot que tout d'un coup )

PS : effectivement, avec 2 tri : 42,06 sec
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

C.Ret a écrit :
Concernant le RPL, on peut aussi limiter la mémoire des donnée en mémorisant la liste triée, puis en utilisant des apels indirect :
Dans le même ordre d'idée mais avec des variables locales :

Code : Tout sélectionner

« SORT DUP 2. MOD
  -> l p
  «
   p l IFT 
   p NOT l IFT
   +
  »
»
C'est quasiment aussi rapide que la version 100% pile
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8384
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Programmer en RPL

Message par badaze »

Je suis totalement rétif au RPL. Beurk.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Pb Euler 36 résolu en RPL :

http://projecteuler.net/index.php?secti ... lems&id=36

C'est le 31ieme ...

Ca doit être être calculable sur beaucoup de plateforme (qui gèrent le binaire qd même ) puisque 900 boucles suffisent avec un peu de réflexion...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

badaze a écrit :Je suis totalement rétif au RPL.
C’est compréhensible d’être un peu perdu quand on est habituer au BASIC ou au RPN, le passage au RPL est au premier abord surprenant.
badaze a écrit :Beurk.
Le RPL reste tout de même l’héritier du RPN. Ce qui doit surprendre c’est la manipulation d’objets.

Si l’on reprend l’exemple simple proposé par Gilles59 du tri d’une liste d’entiers positifs ou négatifs en présentant les nombres impairs avant les nombres pairs, on se rend vite compte que leRPL est bien plus pratique et simple que le RPN (ou même le BASIC).

En effet, si l’on prend par exemple la liste d’entiers suivante : 3 2 1 9 8 4 5 7

En RPL, il suffit de saisir ces nombres à l’intérieur des deux accolades : { 3 2 1 9 8 4 5 7 } pour créer effectivement dans la calculette une liste !

Aller faire aussi simple en RPN ou en BASIC ? Donc le RPL n’est pas si Beurk que cela, bien au contraire, il n’y a pas à ce soucier du codage des objets (liste, vecteurs, matrices, tableaux, graphiques, équations, résultats symboliques ou exacts, ... )
Tout cela est fait nativement par la calculette, c’est très pratique, l’on ne se concentre que sur les traitements, pas sur les mises en forme ou la programmation de la gestion de ces objets. Et en plus, la gestion ‘ramasse miettes’ et ‘par pointeurs’ de l’ensemble et sous-ensemble des objets, garanti une utilisation optimale de la mémoire disponible. On a donc pas non-plus à se soucier de ce paramètre.


Pas convaincu ? Pour essayer de mieux illustrer mes propos, je vais prendre l’exemple du tri particulier de cette liste d’entiers pairs ou impairs en RPN.

Je vais le faire en RPN pour HP-41C, comme cela Charo pourra avec sa nouvelle acquisition essayer mon code et tenter de l’optimiser et peut-être aussi d’en proposer une version pour les Pockets BASIC Sharp (ou Cason, mais je serais surpris !).
Et cela donnera aussi l’occasion d’un bon exercice d’adaptation sur HP-25C à Badaze à moins qu’il ne soit aussi rétif au RPN ?


On ne peut pas manipuler directement de listes d’entiers sur la HP41C, il faut décider de la façon de mémoriser une liste, c'est-à-dire de choisir dans quels registre les éléments de la liste son mémoriser.

Donc là déjà situation opposer au RPL, il faut tout prévoir et surtout écrire du code pour saisir la liste ou l’afficher. Code qui sera intimement lié à la méthode de stockage de la liste que l’on choisi. Il faudra aussi réserver des registres mémoire pour mémoriser la taille de la liste ou son état. Et être sûr qu’il n’y a pas interférence entre les différents programme en mémoire etc..

Pour faire simple, je décide de mémoriser les n éléments de la liste dans les registres R1 à Rn et à mémoriser le nombre d’éléments dans le registre R00.

Je m’attends donc à devoir composer mon programme en trois parties :
- Saisie de la liste, en fait une boucle qui permet de saisir les nombres.
- Tri de la liste (en tenant compte de la parité des éléments),
- Affichage du résultat.

Une bonne chose, après un CLRG qui met à zéro tous les registres, j’ai selon ma convention une liste vide en mémoire.

Il est évident que le tri devra se faire en place, car sur les RPN, la mémoire n’est pas infinie (bien au contraire, encore une raison où les RPL ne sont pas si Beurck que cela). Et de plus, recopier vers une autre zone de la mémoire (donc des registres de stockage, va augmenter la complexité et surtotu le temps d’exécution – fort lent un RPN en général !

Il faut donc éviter autant que possible les boucles.
D’ailleurs pour cela, il doit y avoir un moyen de réunir la boucle de saisie et le tri. Par exemple en utilisant une méthode de tri par insertion. L’idée et d’avoir toujours en mémoire une liste triée. On simplifie alors grandement le problème en ayant que deux parties :
- IN qui permet d’ajouter un élément dans la liste et l’insérant au bon endroit afin de maintenir celle-ci tirée.
- LST qui permet d’afficher la liste en mémoire, c'est-à-dire la liste triée.

Par commodité (le RPN contrairemetn au RPL nécessite souvent ce type d’arrangement pour simplifier le code et son déroulement), le sous-programme d’affichage parcourt les registre du plus éloigné (Rn où n est mémorisé dansR00). Il faudra donc mettre les éléments des les registre dans le sens opposé, R1 contient le dernier élément de la liste (pair et/ou le plus grand) et Rn (c'est-à-dire R(R00) l’impair le plus petit).

Le sous-programme IN est basé sur l’introduction du nouvel élément au bon endroit ; En fait cet élément sera temporairement mémorisé dans la pile, le temps au code de parcourir la liste d’élément et d’éventuellement substituer (insérer) le nouvel élément dans le bon registre. L’élément s’y trouvant étant alors échangé avec la pile afin d’être déplacé vers sa nouvelle position.

Exemple d’utilisation :

Code : Tout sélectionner

CLRG
Commandes R0 R1 R2 R3 R4      ...    R9  LST            Commentaires
CLRG       0  0  0  0                    {}             Remise à zéro liste
3 IN       1  3                          3.     
2 IN       2  2  3                       3.2    
1 IN       3  2  3  1                    1.3.2. 
9 IN       4  2  9  3  1                 1.3.9.2 
8 IN       5  8  2  9  3  1              1.3.9.2.8.
4 IN       6  8  4  2  9  3  1           1.3.9.2.4.8.
5 IN       7  8  4  2  9  5  3  1        1.3.5.9.2.4.8.
7 IN       8  8  4  2  9  7  5  3  1     1.3.5.7.9.2.4.8.
6 IN       9  8  6  4  2  9  7  5  3  1  1.3.5.7.9.2.4.6.8.


Quand au test pour le tri, plusieurs cas de figures peuvent se présenter. S’il faut comparer un nombre pair avec un autre nombre pair ou impair, un nombre plus petit ou plus grand. En fonction des cas, il conviendra ou non d’insérer ou non le nombre de la pile dans le registre testé. Ce peut être fort compliqué à programmer.
Pour simplifier, j’utilise une astuce ; l’addition de deux nombres de même parité donne un nombre pair et celle de deux nombre de parité opposée un nombre impair. L’organigramme du test est donc le suivant :
Pour chaque élément Ri de la liste
- On teste la parité de Rn+Ri.
- Si Rn+Ri est pair (Rn et Ri de même parité), on compare Rn et Ri : si Rn>Ri, on l’insère (échange Ri et Rn),
- Si Rn+Ri est impair (Rn et Ri parité différente), si Rn est impair, on l’insère (échange Ri et Rn),

Il y a donc trois tests à effectuer et éventuellement une seule opération (échange de Ri et Rn).


Ce qui donne pour une HP-41C les deux programmes suivants :

Code : Tout sélectionner

01  LBL"LST             @@@@@@@@@@@@@@@@@@@@@@@@    LIST LISTE 
02  FIX 0               
03  RCL 00              @ R0 nombre d’éléments
04  CLA                 @ efface registre affichage alpha

05  LBL 00              @ 
06     ARCL IND X       @ affiche R(x) dans registre alpha
07     DSE X            @ décrémente x
08     GTO 00           @ et boucle tant que x>0
09  AVIEW               @ affiche registre alpha
10  END

01  LBL"IN              @@@@@@@@@@@@@@@@@@@@@@@@    AJOUT ELEMENT
02  RCL 00              @ n nombre d’éléments
03  1 E3
04  /                   @ compteur 0.nnn pour parcourir liste complète
05  x><y                @ place compteur en y: et Rn en x:
06  ISG 00              @ incrémente R00 (ajout d’un élément)

07  LBL 00              @@@ BOUCLE PRINCIPALE PARCOURT LISTE 
08  ISG Y               @ incrémente compteur i (en y:)
09     GTO 01           @ si i<n alors effectue tests et insertion
10  STO IND 00          @ mémorise Rn (en x:) dans R(R00)
11  GTO"LST             @ affiche liste.

12  LBL 01              @@@ TESTS et insertion éventuelle
13  RCL X
14  RCL IND Z           @ rappelle Ri
15  +                   @ calcul Rn+Ri
16  2
17  MOD                 @ TEST1 : parité Rn+Ri
18  x==0 ?
19     GTO 02           @ vers Test n°2  Rn>Ri ?
20  RDN
21  RCL X
22  2
23  MOD                 @ TEST : parité Rn
24  x==0 ?
25     GTO 03           @ vers insertion

26  LBL 04              @ FIN de TEST
27  RDN
28  GTO 00              @ retour boucle principale

29  LBL 02              @@@ TEST : Rn > Ri ?
30  RDN
31  RCL IND Z           @  rappelle Ri en x
32  X>Y ?               @   Ri > Rn ?
33     GTO 04           @ fin du test

34  LBL 03              @ INSERTION
35  RDN
36  RCL IND Z           @ rappelle R(i) en x
37  x><y                @ échange Rn et Ri
38  STO IND Z           @ mémorise Rn dans registre Ri
39  GTO 04

40  END
Inconvénient de ce code, il est de plsu en plus lent au fur et à mesure de l’ajout des éléments.


Bon , j’attends de voir les versions pour HP25/29, HP67/97 ou HP11/15 qui seront assez différentes car chacune de ces machines utilisent des pointeurs et syntaxe de boucles fort différentes. Encore une raison de préférer le RPL qui présente pour le moment moins de variations que le RPN.

Une version BASIC pour Pocket, serait la bienvenue aussi, pour comparer, car ces machin nécessite aussi de créer et gérer dans le code une liste d’entiers.
Mais je pense que ce doit être tout de même plus lisible que le RPN.

Quoi qu’il en soit, c’est à comparer à
« SORT DUP 2 MOD DUP2 SWAP IFT UNROT NOT SWAP IFT + »
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: Programmer en RPL

Message par charognard »

La question est:
La HP 41 est programmable en RPL ou en LMS ??
http://fr.wikipedia.org/wiki/RPL
Je suis ok avec l'article

Tiens j'ai une CX, je me pencherais pendant mes vacances sur une adaptation de ce programme en séquenciel indexé avec Xfunction
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

charognard a écrit :La question est:
La HP 41 est programmable en RPL ou en LMS ??
http://fr.wikipedia.org/wiki/RPL
Je suis ok avec l'article
Xfunction
Pour moi la 41 est programmable en RPN qui est un ce qu'on appelait 'avant' un LMS (comme les TI58/59, casio 502/602 etc.).RPN veut juste dire "Reverse polish notation". Concernant le RPL, le créateur du langage a bien écrit que dans son esprit il s'agit de Reverse Polish Lisp. A part le "Reverse Polish", RPL et RPN ont bien peu à voir, avec chacun ses avantages et inconvénients. Comme toujours ca dépend de ce qu'on veut faire et le tout est de prendre l'outil adapté.

Si vous voulez du RPL, du lourd, voir http://www.rpl2.net J'avais téléchargée la doc qui bien que non finalisée est tres intéressante. Je n'ai pas l'archi technique et l'OS pour tester tout cela, mais si je trouve du temps ....

Bon je prends ma 50 et ordi portable en vacances même si pas (peu) d'internet, j'ai mis en cache les problèmes de projecteuler.net ;)

Bravo C.Ret pour ton intéressant article ;)
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 106
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Programmer en RPL

Message par OlidaBel »

salut,
Déterrage de post.
RPL , sauvegarde et documentation de vos programmes.

Comment gérez-vous le code de vos programmes et la documentation ?
Avec l'aide d'un PC/Mac ou ou autre ?
HP28 : impression possible, et prise de notes
HP48 : impression possible, et prise de notes
HP50 : impression possible, SD card pour les transferts (le texte est-il protégé et non modifié après la copie ?)
Répondre

Retourner vers « Tous les Pockets »