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 »

Jamais testé RPL/2 encore.

Bon dans le genre " je complique inutilement les choses...). Nul besoin de DOLIST pour créer une nouvelle liste contenant la plus grande valeur à chaque position de 2 listes :

{ 2 7 4 9 1 3 }
{ 3 6 7 1 4 7 }
MAX

>=>

{ 3 7 7 9 4 7}

Idem { 2.4 5.2 6.3} IP
>=> { 2 5 6 }

idem pour MIN, FP (partie fractionnaire) etc etc.
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
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Programmer en RPL

Message par Marcus von Cube »

J'ai téléchargé les sources et le compilateur gfortran pour mon Mac (Leopard 10.5.8 Intel). Il faut qu'on télécharge les sources récentes, les décomprime, issue les commandes "./configure" après "make" et "sudo make install". À ce moment, le "make" est encore en cours. Je jouerai avec RPL/2 de suite.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

zpalm a écrit :A propos de RPL, connaissez-vous RPL/2 ?
Non, je ne connaissais pas.
Et je n'ai pas les moyen (750 € HT la license annuelle ! C'est bien plus que le prix que je peux mettre, même pour un logiciel utilisable à perpétuité. Alors pour une license annuelle !?!

Sinon, je crois que Marge a bien raison, ce qui manque au RPL, c'est avant tout un peu de clareté.

En fait, le code est rapidemetn obscur, car il faut faire un sacré effort pour se représenter ce qui se passe au niveau de la pile. Il n'y a rien dans les codes qui aide à cela. Et je ne développerais pas le problème à suivre cela de près dès qu'il y a des boucles, des tests ou des appels récursifs.

En effet, en lisant du code RPL, rien n'indique combien d'arguments sont pris de la pile et combien y sont déposé.
Il manque réellement quelque part un environnement de programmation et de déboggage qui mettrait l'utilisation de la pile et le eu qui s'y déroule en évidence.
Et le nombre d'argument n'est qu'une partie du problème, car rien n'indique non plus quel type d'objets le code peut traiter, etc.

Je comprends que vu de l'extérieur, hors quelque exepmle simples, le RPL apparaisse obscur et très peu clair. Car c'est bien ce qu'il est; efficace et astucieux à manipuler nombre, objets divers etc., mais isotérique et abscon, ne donnant à la lecture du code aucun indice au lecteur sur son fonctionnement ou son domaine de fonctionnement.
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 »

C.Ret a écrit :
En effet, en lisant du code RPL, rien n'indique combien d'arguments sont pris de la pile et combien y sont déposé.
Il manque réellement quelque part un environnement de programmation et de déboggage qui mettrait l'utilisation de la pile et le eu qui s'y déroule en évidence.
Et le nombre d'argument n'est qu'une partie du problème, car rien n'indique non plus quel type d'objets le code peut traiter, etc.

Je comprends que vu de l'extérieur, hors quelque exepmle simples, le RPL apparaisse obscur et très peu clair. Car c'est bien ce qu'il est; efficace et astucieux à manipuler nombre, objets divers etc., mais isotérique et abscon, ne donnant à la lecture du code aucun indice au lecteur sur son fonctionnement ou son domaine de fonctionnement.
Je suis assez d'accord. On peut clarifier le code si besoin. S'obliger à prendre les éléments depuis la pile sous formes de variables locales et/ou utiliser la fonction en mode algébrique.

1/ Plusieurs façon de créer le même prg :

<< * * >> 'Mult3' STO

<< -> a b c
<< a b c * * >>
>>
'Mult3' STO

ou encore

<< -> a b c
<< 'a*b*c' EVAL>>
>>
'Mult3' STO

et plusieurs façons de l'utiliser (même créé sous la forme * * )

5 3 7 Mult3

ou

'Mult3(5,3,7)' EVAL

Concernant ce qui doit être sur la pile en entrée et ce qui y est en sortie, ca peut etre mis en commentaires en reprenant la logique de la doc HP.

Mais amha, le gros intérêt du RPL est son utilisation en mode intéractif. Juste avec l'exemple précédent en mode intéractif, 5 résulte probablement d'un premier calcul . Idem pour 3 et 7... Bref je calcule 5,il est sur la pile, je peux faire 2 ou 20 min de calcul pour trouver 3 puis 7... et en cliquant sur Mult3 j'ai ce que je veux sans bidouiller de variables ou de ANS() ou de parenthèses inutiles et autre temps perdu. En temps réel, je sais ce que je fais et je visualise la pile. Par contre en mode programmer il est vrai que la relecture est plus complexe car je ne vois pas la pile comme en mode interactif. D'ailleurs quand je joue sur la pile (les ROT UNROT et autre ROLL) en programmant sur PC, j'utilise souvent la HP en // pour simuler ce que çà donne

Concernant le déboguage et l'usage de la pile, le mode debug est bien fait je trouve avec commandes SST qui permettent une exécution pas à pas en voyant ce qui se passe sur la pile, les commandes HALT etc. Je me demande aussi si HPUserEdit ne permet pas de bien voir ce qui se passe sur la pile car elle apparait dans l'environnement de dev mais je ne sais pas l'utiliser et l'aide est en espagnol :( Bon on peut en tout cas facilement écrire du code et choisir "Emulateur -> Debugguer" qui lance le prog dans l'émulateur et permet d'avancer commande par commande avec SST en visualisant la pile.

Pour m'y retrouver dans la pile, style j'y dépose un objet que j'utiliserai bien plus tard, il m'arrive aussi d'indenter le source.

Et puis comme le forth, il me semble que la philosophie RPL est plutot de découper un progr en petits mots-programmes. Ce qui important c'est ce qu'il y a sur la pile en entrée et ce qu'on y trouve en sortie, et donc de pouvoir utiliser cette brique pour dev ce qu'on cherche à faire. Si il s'agit d'optimiser cette brique alors là oui, c'est un peu plus compliqué. Mais en général quand une brique suffisamment générique marche, elle marche on ne la modifie plus.. L'inconvénient est que ca pénalise la vitesse d'exécution. Mais de toute façon si la vitesse d'exécution est primordiale, le User RPL n'est pas le bon cheval.
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 »

Le dernier échange me fait penser à la différence de façon de pensée (enfin pour moi) si je dev un truc en RPL.

Penant l'exemple de "cadavres exquis" voir : http://fr.wikipedia.org/wiki/Cadavre_exquis
. Le principe de ce jeu était que chacun des participants écrive à tour de rôle une partie d'une phrase, dans l'ordre sujet-verbe-complément, sans savoir ce que le précédent a écrit.
Soit { 'sujet' 'verbe' 'complément' }

Voilà déjà le coeur du prog RPL, le reste est tuyauterie
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
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Programmer en RPL

Message par Marcus von Cube »

C.Ret a écrit :
zpalm a écrit :A propos de RPL, connaissez-vous RPL/2 ?
Non, je ne connaissais pas.
Et je n'ai pas les moyen (750 € HT la license annuelle ! C'est bien plus que le prix que je peux mettre, même pour un logiciel utilisable à perpétuité. Alors pour une license annuelle !?!
Tu n'est pas obligé de payer si tu n'utilise que l'interpréteur. Le prix indiqué est pour le compilateur qui peut créer des logicielles stand alone.
Gilles59 a écrit :ou encore

<< -> a b c
<< 'a*b*c' EVAL>>
>>
'Mult3' STO
ou encore

<< -> a b c
'a*b*c'
>>
'Mult3' STO

Si je ne me trompe pas.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Marcus von Cube a écrit :
C.Ret a écrit :
Gilles59 a écrit :ou encore

<< -> a b c
<< 'a*b*c' EVAL>>
>>
'Mult3' STO
ou encore

<< -> a b c
'a*b*c'
>>
'Mult3' STO

Si je ne me trompe pas.
Tu as raison, l'EVAL ne sert à rien à cet endroit
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 »

Ci après une version simple des cadavres exquis identique à celle en Delphi de Matt 261
http://www.delphifr.com/codes/GENERATEU ... 37310.aspx

C'est une version très basique ( pas de gestion des accords singulier/ puriel...)

Je décline le prog, je le lance et première sortie :
"Ces dames envie sur moi"
LOL pas fait expres je vous jure ... Mais je sais que :

"Claire écrase son Mammouth"
"Tu chantes dans le pot de peinture"
"Mon prof navigue sa leçon"
"Elle étonne de la paille"

;)

je ne suis pas sur que la version Delphi soit plus claire que celle-ci (je vous accorde que la version Delphi comme tous les langages qui gèrent l'IHM windows est composée à 80% de son code des pb de fenêtres, boutons etc, mais le coeur du progr me semble bien moins clair et 'naturel' qu'ici)

La version ici pourrait aussi être bien simplifié, mais j'ai choisis cette structure pour aller plus loin ensuite (adjectifs, accord du genre, et pluriel singulier)

Vais voir pour une version plus sophistiquée.

"

Code : Tout sélectionner

%%HP: T(0)A(D)F(.);
@===================================================================
@  Cadavres exquis HP48G/49/50. D'après : 
@  http://www.delphifr.com/codes/GENERATEUR-CADAVRES-EXQUIS_37310.aspx
@  de Matt 261
@===================================================================
«
   { 'Sujet' 'Verbe' 'Complément' }
   « EVAL » DOSUBS 
   « + » STREAM MSGBOX
» 
'Exquis' STO

@====================================================================
@ Sujet / Entrée : Rien    Sortie : STRING (le sujet de la phrase)
@--------------------------------------------------------------------
« Voca HEAD DUP SIZE RAND * 1 + IP GET » 'Sujet' STO

@====================================================================
@ Verbe / Entrée : Rien    Sortie : STRING (le verbe de la phrase)
@--------------------------------------------------------------------
« Voca 2. GET DUP SIZE RAND * 1 + IP GET »'Verbe' STO

@====================================================================
@ Complément / Entrée : Rien    Sortie : STRING (le complément de la phrase)
@--------------------------------------------------------------------
« Voca 3. GET DUP SIZE RAND * 1 + IP GET » 'Complément' STO

@====================================================================
@ Voca / Vocabulaire. Copier-Coller de  la version DELPHI de Matt 261 +qqes corrections
@--------------------------------------------------------------------

{ 
 {
  " Anne"" Ce bouricot"" Ces dames"" Cet acteur"" Claire"" Des libellules"" Elle"" Elles"" Francky"" Il"" Ils"" Je"" John"" La bergère"
  " La calèche du roi"" La coccinelle"" La concierge"" La fontaine"" La guenon"" La mandarine"" La mère Noël"" La mygale"" La pomme"
  " La présidence"" La princesse"" La sardine"" La télévision"" La voiture"" L'arbre"" L'arrosoir"" L'artiste"" Le bouquetin"" Le bovidé"
  " Le bureau"" Le calif"" Le capitaine"" Le chien"" Le détective"" Le directeur"" Le docteur"" Le footballeur"" Le gamin"" Le grand dadet"
  " Le microbe"" Le ministre"" Le monde"" Le monsieur"" Le père Noël"" Le poupon"" Le président"" Le rhinocéros"" Le skieur"" Le voleur"
  " L'entrepreneur"" Les colportateurs"" Les jouets"" Leurs asperges"" Leurs bisons"" Lui"" Ma grand-mère"" Maman"" Maman Ours"" Marc"
  " matt261"" Mes bettraves"" Mes parents"" Mes plantes"" Mickey"" Minousme"" Mon amie"" Mon bébé"" Mon chirurgien"" Mon dragon"" Mon frère"
  " Mon hamster"" Mon passager"" Mon prof"" Mon sandwitch"" Mon très cher ami"" Nicolas"" Notre jument"" Nous"" On"" Papa"" Paul et moi"
  " Raphaël"" Ratus"" Sa proie"" Son carburateur"" Son fantôme"" Son lapinou"" St Nicolas"" Ta chèvre"" Tarzan et Jeanne"" Thomas et Lu"
  " Toi et moi"" Ton frère"" Toto"" Tu"" Un alien"" Un chacal"" Un dinosaure"" Un mamouth laineux"" Un merland"" Un scientifique"" Une hyène"
  " Une marmotte"" Une orange"" Vous"
 }
 {
  " dors"" rigole"" part"" s'esclaffe"" regarde"" apercois"" mange"" s'enouie"" délire"" manque d'inspiration"" s'assied sur"" efface"
  " programme"" configure"" endors"" supprime"" feuillette"" exécute"" satisfait"" tape"" maltraite"" joue"" nage avec"" tombe"" parie"
  " se trempe"" s'énerve"" déchire"" tombe"" casse"" engueule"" parle"" bavarde"" s'ennuie"" s'active"" écrase"" examine"" surfe"" exploite"
  " découvre"" hénni"" bêle"" miaule"" aboit"" meugle"" patauge"" scie"" apprend"" aime"" envie"" ajoute"" ingurgite"" absorbe"" pialle"
  " croasse"" sors"" entre"" croise"" calcule"" demande"" cloue"" apprend"" décape"" chante"" grille"" épluche"" prend"" récite"" abandonne"
  " dévie"" nettoie"" enferme"" coupe"" campe"" caracole"" captive"" chancèle"" change"" écrase"" charge"" opère"" colore"" commence"
  " compense"" interview"" téléphone"" installe"" occupe"" atténue"" intègre"" interpelle"" jalouse"" jubile"" joint"" caquette"" sabote"
  " laisse"" lessive"" rénove"" repli"" déguste"" extermine"" hante"" commande"" navigue"" abbat"" abdique"" aborde"" abrite"" abrutit"
  " incommode"" codifie"" cogne"" compare"" complimente"" conçoit"" débarbouille"" achète"" décapite"" descend"" monte"" éternue"" sacrifie"
  " génère"" excite"" éberlue"" poste son message"" tchatte"" consulte"" classe"" étonne "
 }
 {
  " avec son chat."" avec du chocolat."" au magasin."" sur son ordinateur."" devant la télé."" assis sur son fauteil."" en mangeant du pop-corn"
  " avec une brosse à dents."" en se mouchant."" en écoutant de la musique."" à la piscine."" à la montagne."" en caressant son chat."" sur son ordinateur."
  " avec mamie."" dans le jardin."" avec son ami."" sur moi."" dans sa maison."" dans sa niche."" sur son perchoir."" à la mer."" dans son bocal."
  " dans sa voiture."" sur sa branche."" dans une marmitte."" en jouant du piano."" dans la prairie."" dans son lit."" en sirotant un cognac."" dans le four."
  " sur une chaise."" sur sa planche."" sur son clavier."" dans le pot de peinture."" sur le tapi."" tout à l'heure."" avec son Mammouth."
  " à l'école."" avec une vache à lait"" dans sa grotte."" dans la rue."" avec une marmotte."" avec un dinosaure."" avec un alien."" dans la chocolaterie."
  " en mangeant des nouilles."" derrière son écran."" sous sa mangeoire."" en prenant un bain de soleil."" en apprenant sa leçon."" dans sa litière."" avec le prisonnier."
  " sur les arbres."" six pieds sous terre."" une chanson."" en buvant sa tasse de thé."" à l'école."" dans leur igloo."" à la ferme."" son poulain."
  " les moutons."" un panneau."" de l'argent."" de la paille."" un verre d'eau."" sur DelphiFr."" au clair de la Lune."" avec ses amis."
  " au restaurant."" dans la fromagerie."" une bande de voyoux."" sur Internet."" dans un grand verre d'eau."" avec beaucoup de miel."
 }
   
}
'Voca' STO
[/size]
Modifié en dernier par Gilles59 le 22 janv. 2011 17:29, modifié 4 fois.
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 »

Dans le prog précécent si on change 'Exquis' comme çà :

Code : Tout sélectionner

«
   { 'Sujet' 'Verbe' 'Sujet' " qui" 'Verbe' 'Complément' }
   « EVAL » DOSUBS 
   « + » STREAM MSGBOX
» 
'Exquis' STO
Ca donne des truc assez drôles genre :
"Claire occupe un mamouth laineux qui épluche sa leçon"
"Le microbe exécute la sardine qui exploite son chat"
" Un alien charge mon tres cher ami qui programme sur son perchoir"
"Une orange mange une hyène qui grille sur une planche"
"Maman ours aperçois Raphael qui manque d'inspiration dans son bocal"

Code : Tout sélectionner

{ 'Sujet' "," 'Complément' "," 'Verbe' 'Sujet' " qui" 'Verbe' 'Complément' }
->
Mon hamster, sur sa planche, lessive une hyène qui opère une marmotte
La mère Noel, dans sa niche, codifie l'arbre qui enferme les moutons
Mon amie, son ami, s'assis sur mon très cher ami qui joue dans sa litière
L'entrepreneur, à la ferme, nettoie la guenon qui rigole dans une marmitte
Tarzan et Jane, une bande de voyous, sacrifie le rhinocéros qui miaule sur ta chaise
Par contre ca parle jamais de lapin, je vais changer çà !
:mrgreen:

Il y a des trucs peu cohérents dans les compléments que j'ai repris tels quels. Pour avoir des phrases toujours correctes syntaxiquement il faudrait différencier divers type de complément (de lieu ou autre etc.). Là tout est mélangé
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 : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Merci Marcus, je n'avais pas compris que les versions payantes ne concernent que le compilateur et que l'interpréteur est donc libre. Il me reste donc juste à trouver autour de moi un système disponible pour essayer.

Et effectivement :

Code : Tout sélectionner

<< -> a b c  'a*b*c' >>  'Mult3' STO
Et la version idéale, car Mult3 est alors considérée comme une fonction analytique. On peut donc l'utiliser dans une expression algébrique, une expression symbolique, en calculer la dérivée ou l'intégrale, etc.

Mais, son utilisation est moins rapide que le programme << * * >> 'MULT3' STO qui lui n'est pas très lisible. Sauf pour Marge, car pour le coup, ce programme RPL ressemble comme deux gouttes d'eau à son homologue RPN.

En fait, s'il est difficile d'illustrer l'utilisation de la pile et ses mouvements sur l'affichage limite de la calculatrice, un éditeur de programme sur ordinateur, en couleur et avec une représentation graphique du code (un peu comme Visual Basic ou Visual C - des code couleur et des graphique pour mettre en évidence le fonctionnement du code) pourrait fournir une base à une représentation plus explicite des algorithmes et des astuce en RPL (mais aussi en RPN en fait).


3:__________________________
2:_______________......................|
1:_______________|.....................|
.................................|.....................|
....<<..........................*__________|
.......................................................|
.......................................................*.....>>
.......................................................|________________ :1


P.S.:
Concernant Voca, incroyable le nombre de caratères espaces que contient cette liste. Tous les atomes sont des chaines de caratères et commencent par un espace. Ne pourrait-on pas faire quelque chose pour éviter cela (très difficile à saisir sur une HP28C/S qui ne communique pas avec l'extérieur sauf par son clavier.

De même pour la majuscule de dbut de phrase et le point final.

De m
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 »

Hello C.Ret,

intéressant !

Quelques remarques :

- Pour voca j'ai copier/coller et utilisé Notepad++ (que je vous recommande ! y compris pour du HTML ou autre) pour virer les retour chariot et autre
- Mettre un caractére en majuscule/minuscule est facile en RPL avec un OR ou AND binaire (bit 7 il me semble)
- J'ai pas trop chercher à comprendre mais adapté le prog delphi. L'idée éatit justement de ne pas avoir à trop modifier la la liste ! Effectivement on peut faire bien mieux

Pour le moment je suis plongé dans : http://www.synapse-fr.com/grammaire/GTM_0.htm :O LOL
J'ai au moins appris un nouveau mot : syntagme (au scrabble ca peut le faire ;)
mon nouveau prog gére le masculin/féminin, les subtilité du l' etc. ;) pas fini mais prometteur

Le principe est en gros celui là :

Code : Tout sélectionner

@===================================================================
@  Générateur automatique de phrase HP48G (?) et suivantes en RPL
@===================================================================
«
   { 
    { { GNominal } 1 } 
    { { GVerbal } 1 }
    { { GNominal} .8 }
   }
   Génére 
   MSGBOX
» 
'Exquis' STO


@====================================================================
@ GNominal/ Entrée : Rien    Sortie : STRING (un groupe nominal de la phrase)
@--------------------------------------------------------------------
« "" -> <-Genre
 «
  { 
   { { Nom } 1 }
   { { Article } 1 } 
   { { SWAP } « <-Genre 'np' SAME NOT » }
   { { Adjectif } <-Genre  'np' SAME {0} {.5} IFTE }
  }
  Génére
 »
» 
'GNominal' STO

etc.

@====================================================================
@ Génére la partie de phrase
@ Entrée : LIST une liste "grammaticale"
@ Sortie : STRING la phrase (ou le morceau de)
@--------------------------------------------------------------------
«
  1. «  EVAL RAND > { EVAL } { DROP } IFTE » DOSUBS 
  "" + « + » STREAM 
»
'Génére' STO

GN1 et GN2 seront peut etre des bases différentes pour que que le résultat soit plus drôle
[/size]

Le chiffre apres le code symbolique ( GNominal GVerbal etc.) correspond à la probabilité de générer cette partie (de 0 à 1).'np' pour les nom propre (cas particulier, il n'y a pas d'article donc pas de SWAP). Notez le SWAP puisque l'article dépend du genre du nom. De même "antoine" ne peut pas trop être vert ou jaune (mais il peut être furieux ou content ...). Bon je vais essayer de pas trop compliquer quand même
Pas sur que çà marche sur 48G car je pense que la syntaxe <-variable est nouvelle

PS :

"<< * * >> 'Mult3' STO
permet tout à fait de faire 'Mult3 (a,b,c)' sur la 50 en tout cas,
Ca donne : a.b.c
(. pour *)

PPS :sur 49G et suivante on peut afficher 12 niveaux de la 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 : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Malheureusement,
<< * * >> 'MULT3' STO ne permet pas d'utiliser 'MULT3(2,3,4)' sur une HP28 ("Improper User Function ERROR").

Cela ne marche pour << -> a b c << a b c * * >> >> ou pour << -> a b c 'a*b*c' >>
Par contre seule la dernière forme permet d'être dérivée.
'MULT3(a,3,4)' 'a' d/dx renvoi 12
'da(MULT(a,3,4))' ------ EVAL ------> 'da(a)*(3*4)' ------ EVAL ------> 12


Sinon, l'idée de noter graphiquemetn le niveau de la pile rend la représentation graphique du code assez difficile à générée sans un "éditeur" adpaté.

Plus simplement, on peut ne pas faire figurer les traits horizontaux ____ et verticaux | et respectant une norme simple.

Il faut aligner les arguments les uns en dessous des autre à gauche de l'opérateur.

Les opérateurs unaires ne prenant qu'un seul argument peuvent ainsi être laissés sur la même ligne que leur argument unique.
Par exemple :

Code : Tout sélectionner

« 3.1415 CHS ABS INV SIGN »
Par contre, les opérateurs prenant deux ou plusieurs argument nécesitent de revenir à la ligne et d'aligner :

Code : Tout sélectionner

 
Par exemple « 2 3 + » s'écrira 
« 2
  3 + »

Par exemple 'M' { 2 3 } 45.3 PUT s'écrira (à gauche j'ai rajouté les liens 
«     'M'                   @     'M' _
  { 2 3 }                   @ { 2 3 } _|
     45.3 PUT »             @    45.3 _|_ PUT


Par exemple 'ABS(MULT3(a,3,4))' s'écrirai:
« a                         @ 'a' __
  3                         @   3 __|
  4 MULT3 ABS »             @   4 __|__ MULT3 __ ABS ___ ...


Par exemple '(2+3)/(4*5-3^2)' soit « 2 3 + 4 5 * 3 2 ^ - / » devra s'écrire :
«   2              @ le 2 et le 3 alignés à gauche du +        
    3 +            @ le + et le - alignés à gauche du / (se sont les arguments de ce dernier)
  4                @ on revient à la ligne car 4 ne prend aucun argument
  5 *              @ le 4 et 5 aligné à gauche du *
  3                @ retour à la ligne car 3 ne prend pas d'argument
  2 ^ - / »        @ 3 et 2 argumetns de ^, donc alignés
                   @ * et ^ alignés à gauche du - (on pourrait tracer les liens en vert)

Ca ne change pas grand-chose, mais cela fait toute la diffèrence.

Pour illustrer mon propos, voici le code pour les cadavres exquis, remis en forme selon ce principe simple.
Notons que DUP fait exception, il ne se trouve pas à gauche de son argument afin de privilégier et mettre en évidence l'utilisation ultérieure du 'double' dans le code (et aussi pur gagner de la place en se rapprochant de la marge gauche).

Code : Tout sélectionner

%%HP: T(0)A(D)F(.);
@===================================================================
@  Cadavres exquis HP48G/49/50. D'après : 
@  http://www.delphifr.com/codes/GENERATEUR-CADAVRES-EXQUIS_37310.aspx
@  de Matt 261
@===================================================================
« { 'Sujet' 'Verbe' 'Complément' }
                          « EVAL » DOSUBS 
                                    « + » STREAM MSGBOX » 
                                                 'Exquis' STO

@====================================================================
@ Sujet / Entrée : Rien    Sortie : STRING (le sujet de la phrase)
@--------------------------------------------------------------------
«       Voca HEAD 
  DUP SIZE 
      RAND *
           1 + IP GET »
                'Sujet' STO

@====================================================================
@ Verbe / Entrée : Rien    Sortie : STRING (le verbe de la phrase)
@--------------------------------------------------------------------
«        Voca 
           2. GET 
  DUP SIZE 
      RAND *
           1 + IP GET »
                'Verbe' STO

@====================================================================
@ Complément / Entrée : Rien    Sortie : STRING (le complément de la phrase)
@--------------------------------------------------------------------
«        Voca
           3. GET
  DUP SIZE 
      RAND *
           1 + IP GET »
           'Complément' STO

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 »

On a vu (page 3 et suivante) que l'instruction DOLIST permet depuis la 48G d'appliquer un programme à l'ensemble des éléments d'une liste

Il peut parfois être intéressant de faire l'inverse, c'est à d'appliquer un ensemble de programme à un objet et d'avoir l'ensemble des résultats dans une liste

C'est aussi possible. Voir le topic sur les carrés magiques (page 2) pour un exemple de ce genre.

Le principe

Code : Tout sélectionner

«
  -> Donnée
  «
    {Prg1 Prg2 Prg3 Prg4 etc...} 1 «  Donnée SWAP EVAL » DOSUBS
  »
»
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 »

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.

Pour éclairer je reprends le "programming contest" du HHC2010.

Soit une liste de nombres entiers aléatoires (positifs ou négatifs). On veut en sortie la même liste avec les nombres impairs triés suivis des nombres pairs triés. Pour faciliter la compréhension, on va partir ici d'une liste de 10 chiffres. (le challenge initial est de 64 nombres entiers mais çà ne change rien) par exemple { 5 3 4 2 1 9 7 8 6 }

L'idée de base serait de décomposer la liste en deux sous-listes (les pairs et les impairs), de les trier (le tri peut aussi se faire avant) et de les concaténer. La parallélisation du traitement de liste permet de bien simplifier les choses ...

Si x est sur la pile 2 MOD retourne 1 si le nombre est impair, 0 sinon. Appliqué à notre liste cela donne :

{ 5 3 4 2 1 9 7 8 6 } 2 MOD
{ 1 1 0 0 1 1 1 0 0 }

Mais la commande IFT ( IF THEN) qui permet un test en mode complétement RPL est également parallélisable. Comme 0 équivaux à FAUX en RPL et tout autre nombre à VRAI :

{ 1 1 0 0 1 1 1 0 0 }
{ 5 3 4 2 1 9 7 8 6 }
IFT

donne :

{ 5 3 1 9 7 }

Bref on a là un moyen hyper simple d'extraire tous les nombres impairs d'une liste. On peut les trier ici, mais le plus simple est plutôt de tout trier au début :

Code : Tout sélectionner

 SORT DUP 2 MOD SWAP IFT
Pour récupérer les "pairs" il suffit de faire un NON logique sur la liste de test

Code : Tout sélectionner

 SORT DUP 2 MOD NOT SWAP IFT
Pour répondre à la question initiale :

Code : Tout sélectionner

  SORT           @ Tri la liste
  DUP 2 MOD      @ Génére la liste boolenne des pairs et impairs
  DUP2           @ Duplique les 2 éléments à la base de la pile  
  SWAP IFT       @ Génére la liste triée des impairs
  UNROT NOT      @ Non logique de la liste pair/impaire
  SWAP IFT       @ Génère la liste des pairs
  +              @ concanéte les 2 listes
43 octets donc ...

L'intérêt c'est que cette façon de faire utilisable dans pas mal de cas... A noter que IFTE permet de mixter 2 listes en prenant les éléments dans l'une ou l'autre suivant un test quelconque. C.Ret va dire que ca ne fonctionne pas sur la 28 :D , n'empêche que ces possibilités de traitement de liste sont bien agréables.
Modifié en dernier par Gilles59 le 14 juil. 2011 19:15, modifié 3 fois.
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 : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

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:
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.
Répondre

Retourner vers « Tous les Pockets »