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 »

Bonjour c.ret !

Suis bluffé par le 400 ‘L(2)’ STO

Je n'avais même pas pensé que c'était possible mais à la réflexion c'est très naturel. Ca marche aussi sur HP50... Idem pour tous tes exemples d'ailleurs. Je pense que HP a été tres vigilant sur la compatibilité ascendante.

OBJ-> Fonctionne comme LIST-> (qui existe toujours pour compatibilité). La différence est que OBJ-> est plus puissant et s'applique à tout les objets :

Par exemple

'A+B' OBJ->
>=donne sur la pile =>
A B 2 +

La logique est :
Appliquer la fonction +
à 2 arguments
second argument B
premier argument A

'SIN(45)' OBJ->
SIN 1 45

'SIN(A+B)' OBJ->
SIN 1 'A+B'

OBJ-> ne transforme en RPN que la premiere fonction trouvée. Il faut procéder récursivement pour tout transformer

Il y a un exemple de prog dans le AUR (Advanced users reference guide) qui traduit toute expression algébrique en équivalent RPN

OBJ-> permet aussi de transforme une chaine alpha en 'code symbolique' :
"Nom" OBJ->
'Nom'

Ce qui peut etre pratique parfois par exemple pour lancer un prog dont le nom est une chaine alpha


Concernant SORT

Essayer de trier une liste non homogène provoque un "SORT erreur : type d'argument incorrect" (j'ai passé ma 50 en français)
Il faut "homogénéiser" la liste avant (en transformant tout en alpha par ex) t :

{ 3 4 2 "3" } 1 «->STR» DOLIST SORT

DOLIST, j'y reviendrai, permet d'appliquer un programme à tous les éléments d'une ou plusieurs liste. Dans le cas ci dessus le programme transforme tous les objets d'une liste en chaine alpha. A noter que { 1 2 3 } ->STR donne "{ 1 2 3 }" alors que { 1 2 3 } 1 <<->STR>> DOLIST donne {"1" "2" "3" }

PS :
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 }.
Idem en 50

PPS
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.
Je ne comprends pas bien. As tu un ex ? Tout ce que tu expliques avant fonctionne pareil sur une 48/49/50
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
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 »

‘L(6)’ EVAL renvoi "Lapin".

Tu sais ce qu'il te dit le lapin ??
Tipoucet
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3811
Enregistré le : 10 janv. 2009 13:47

Re: Programmer en RPL

Message par Tipoucet »

charognard a écrit :
‘L(6)’ EVAL renvoi "Lapin".
Tu sais ce qu'il te dit le lapin ??
Incroyable cette formule qui fait surgir un lapin 8O

Au fait bonjour Charognard :wink:
Dominique
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Et tous nos voeux pour 2011.
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 »

Salut tous le monde et bonne année
Je vous lis mais peu de temps pour intervenir, j'ai un autre centre d'interet mais ça va revenir
à bientôt
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Continuons d'explorer la commande DOLIST, une des commandes de traitement de listes en RPL, avec quelques exemples.

La commande DOLIST existe depuis la HP49, mais doit pouvoir être créée en RPL sur les28 et 48 (bon exercice)... Quelques exemples :

Soit deux listes de chiffres, on veut une liste avec la plus forte valeur pour chaque position dans la liste :

Code : Tout sélectionner

{ 2 7 4 9 1 3 }
{ 3 6 7 1 4 7 }
2 << MAX>> DOLIST

>=>

{ 3 7 7 9 4 7}
DOLIST applique le programme entre << et >> élément par élément sur le nombre de liste précisé. Les éléments des listes sont placés sur la pile, traités et une nouvelle liste est créé si le programme dépose des résultats au bon niveau de pile.

Imaginons qu'on veuille depuis une liste de nombres obtenir la liste des nombres premiers qui la compose :

Code : Tout sélectionner

{ 0 1 2 3 4 5 6 7 8 9 }
1 << DUP ISPRIME? NOT { DROP } IFT >> DOLIST 

>=>

{ 2 3 5 7 } 
Comment compter le nombre de nombre premier d'une liste ?

Code : Tout sélectionner

0 { 0 1 2 3 4 5 6 7 8 9 }
1 << ISPRIME? { 1 + } IFT >> DOLIST 

>=>

4

Conjugaison au présent des verbes du 1 groupe :

Code : Tout sélectionner


«
 { "je" "tu" "il" "nous" "vous" "ils"}
 { 
   "PRESENT"      { "e"   "es" "e"  "ons"   "ez" "ent"}
   "IMPARFAIT"    { "ais" "ais" "ait" "ions" "iez" "aient"}
   "FUTUR"        { "erai" "eras" "era" "erons" "erez" "eront"}
   "CONDITIONNEL" { "erais" "erais" "erait" "erions" "eriez" "eraient"}
 }
  -> Verbe Pronom Conj
  «
    DO
      Conj HEAD " de " + Verbe + 
      Pronom
      Conj TAIL DUP TAIL 'Conj' STO 
      HEAD 
      2 «  SWAP " " + Verbe  DUP SIZE 2 - 1 SWAP SUB +  SWAP +  » DOLIST
    UNTIL Conj {} SAME END
  »
  8. ->LIST
»
'Grp1' STO

Code : Tout sélectionner

Exemple d'utilisation :

{ "chanter" "danser" "programmer" "chasser" }
1 « Grp1 » DOLIST

>=> 

Code : Tout sélectionner

{ { "PRESENT de chanter" { "je chante" "tu chantes" "il chante" "nous chantons" "vous chantez" "ils chantent" } "IMPARFAIT de chanter" { "je chantais" "tu chantais" "il chantait" "nous chantions" "vous chantiez" "ils chantaient" }
"FUTUR de chanter" { "je chanterai" "tu chanteras" "il chantera" "nous chanterons" "vous chanterez" "ils chanteront" } "CONDITIONNEL de chanter" { "je
chanterais" "tu chanterais" "il chanterait" "nous chanterions" "vous chanteriez" "ils chanteraient" } } 
 "PRESENT de danser" { "je danse" "tu danses" "il danse" "nous dansons" "vous dansez" "ils dansent" } "IMPARFAIT de danser" { "je dansais" "tu dansais" "il dansait" "nous dansions" "vous dansiez" "ils dansaient" } "FUTUR de danser" { "je danserai" "tu danseras" "il dansera" "nous danserons" "vous danserez" "ils danseront" } "CONDITIONNEL de danser" {"je danserais" "tu danserais" "il danserait" "nous danserions" "vous danseriez" "ils danseraient" } }
{ "PRESENT de programmer" { "je programme" "tu programmes" "il programme" "nous programmons" "vous programmez" "ils programment" }
"IMPARFAIT de programmer" { "je programmais" "tu programmais" "il programmait" "nous programmions" "vous programmiez" "ils programmaient" }
"FUTUR de programmer" { "je programmerai" "tu programmeras" "il programmera" "nous programmerons" "vous programmerez" "ils programmeront" } "CONDITIONNEL de programmer" { "je programmerais" "tu programmerais" "il programmerait" "nous programmerions" "vous programmeriez" "ils programmeraient" } } 
{ "PRESENT de chasser" { "je chasse" "tu chasses" "il chasse" "nous chassons" "vous chassez" "ils chassent" } "IMPARFAIT de chasser" { "je chassais" "tu chassais" "il chassait" "nous chassions" "vous chassiez" "ils chassaient" } "FUTUR de chasser" { "je chasserai" "tu chasseras" "il chassera" "nous chasserons" "vous chasserez" "ils chasseront" } "CONDITIONNEL de chasser" { "je chasserais" "tu chasserais" "il chasserait" "nous chasserions" "vous chasseriez" "ils chasseraient" } } }
[/size]

Nous verrons la prochaine fois la commande MAP.
Par exemple si on applique à la liste précédente çà :

Code : Tout sélectionner

REVLIST HEAD «" le lapin" + » MAP
>=>

Code : Tout sélectionner

{ 
"PRESENT de chasser le lapin" 
 { "je chasse le lapin" "tu chasses le lapin" "il chasse le lapin" "nous chassons le lapin" "vous chassez le lapin" "ils chassent le lapin" } 

"IMPARFAIT de chasser le lapin" 
{ "je chassais le lapin" "tu chassais le lapin" "il chassait le lapin" "nous chassions le lapin" "vous chassiez le lapin" "ils chassaient le lapin" }

"FUTUR de chasser le lapin" 
{"je chasserai le lapin" "tu chasseras le lapin" "il chassera le lapin" "nous chasserons le lapin" "vous chasserez le lapin" "ils  chasseront le lapin" }

"CONDITIONNEL de chasser le lapin" 
{ "je chasserais le lapin" "tu chasserais le lapin" "il chasserait le lapin" "nous chasserions le lapin" "vous chasseriez le lapin" "ils chasseraient le lapin" } 
}
[/size]

Bon vous pouvez aussi chasser les lièvres bien sur :D
Modifié en dernier par Gilles59 le 20 janv. 2011 22:39, modifié 2 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
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 »

Juste pour l'exemple
Ne serait il pas possible de prendre des canards ?
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 :Juste pour l'exemple
Ne serait il pas possible de prendre des canards ?
Oui on peut ! Suffiit d'appliquer çà à la liste :

« DUP SIZE 4 - "canard" REPL » MAP

On peut aussi canarder (premier groupe) le lapin. Par contre je ne suis pas sur que lapiner le canard soit français :pirat:

Pour revenir à MAP, cette commande balaie tous les items de la liste en incluant les sous listes.
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 : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Je ne suis pas surpris d'apprendre que ce qui fonctionne sur une HP28S, fonctionne de même sur les suivantes, HP a veiler à la compatibilité ascendante et surtout à éviter autant que possible des "variations" entre les modèles pour éviter des variation du standard qui conduiraient inmanquablement à des erreur et confusion.

L'exception est peut-être la fonction d'intégration qui n'a pas les mêmes argument entre les HP3x/4x/50 et les HP2x.

Gilles59 a écrit :Je ne comprends pas bien. As tu un ex ?
L'exemple le plus simple est celui qui permet d'obtenir les éléments d'une matrice:

Supposons que l'on a une matrice M, par exemple de 4x5 :

Code : Tout sélectionner

[[ 89 70 74 30 52 ]
 [ 49 82 37  7 85 ]
 [ 41  8 81 79 33 ]
 [  9  2 21 58 21 ]]
'M' STO
Et que l'on souhaite afficher les 6 éléments se trouvant au centre de M, on peut par exemple écrire le programme suivant qui utilise deux compteurs locaux i et j :

Code : Tout sélectionner

« 2 3 FOR i
       2 4 FOR j
          'M' { i j } GET   @ obtient M(i,j)
          1 DISP 5 WAIT     @ affiche et attend 5 secondes
       NEXT
  NEXT
»
Dans ce programme, la liste { i j } contenant deux variables locales est 'évaluée' par l'instruction GET en fonction des valeurs des variables en question.
Ce qui constitue une exception de la régle en vigueur sur le HP28S, qui dit que l'évaluation d'une liste donne la liste elle-même.



Sinon, j'ai toujours un peu de mal avec l'instruction ADD.

D'abord, pourquoi ne pas l'avoir appelée SUM et y-a-t-il l'instruction équivalente mais pour le produit des éléments de la liste.
{ 1 2 3 4 5 } SUM renverrai 1+2+3+4+5= 15
{ 1 2 3 4 5 } PROD renverrai 1*2*3*4*5= 5! = 120

Ensuite, l'idée de 'vectorialiser' ou paralléliser les calculs avec des liste en argument est excellente, c'est une idée qui est à base de pas mal d'outil de programmation matriciel (comme MatLab et autre MathCad) mais sans l'inconvénient de devoir créer de nouveaux opérateurs ou d'avoir à ajouter un opérande marquant la 'vectorisation du calcul':

{ 1 2 3 4 5 } SQ renvoi { 1 4 9 16 25 }
DEG { 0 45 90 135 180 } SIN renvoi { 0.000 0.707 1.000 0.707 0.00 }
DEG { (1,30) (2,60) (3,90) } R->P renvoi { (0.866,0.500) (1.000,0.000) (1.732,3.000) }
{ 1.1 -2.2 3.3 -4.4 -5.5 } ABS FLOOR renvoi { 1 2 3 4 5 }
etc

On peut ainsi utiliser toutes les fonctions disponibles, très astucieux (et fort utile en algébre linéaire et autre calculs matriciels)
Et rien ne nous oblige à n'utiliser que des fonctions unaires, on pourrait étendre le principe aux fonction binaire et ternaire :

{ 1 2 3 4 } { 5 6 7 8} R->C retournerai { (1,5) (2,6) (3,7) (4,8) }
{ 12 13 14 } { 7 8 9 } MOD retournerai { 5 5 5 }
DEG { 1 2 3 } { 30 60 90 } P->R renverrai { 0.866 1.000 0.000} { 0.500 1.732 3.000 }

Et là, j'ai un soucis avec la fonction binaire d'addition + qui se confond avec ADD (instruction de concaténation et SUM dans la version actuellement implanté dans les HP)
Si l'on suit la logique de l'idée géniale précédente :
{ 12 13 14 } { 7 8 9 } + devrait retourner { 19 21 23 } et non pas { 12 13 14 7 8 9 }
Pour obtenir cette dernière liste, on utiliserai l'opérateur de concaténation (CONCAT ou ADD pour faire court)
"Lapin" "Garou" ADD retournerai "LapinGarou"
'A' 'B' ADD retournerai 'ADD(A,B)'
{ 12 13 14 } { 7 8 9 } ADD retournerai { 12 13 14 7 8 9 }
Cet opérateur est binaire (il prend deux arguments et les assemble, il peut donc être lui aussi utilisé pour une opération vectorialisée (ou parallèlisée):
{"Lapin" { 12 13 14 } 45 A} {"Garou" { 7 8 9 } 23 B } ADD donnerai donc {"LapinGarou" {12 13 14 7 8 9} [45 23] ADD(A,B)}


La question est alors, comme pour SORT, mais que donne alors 2 "Truc" ADD ? Où faut-il arrêter la logique d'évaluation ? Comment convertir un objet d'un type à un autre ?
C'est pourtant une astuce que l'on utilise souvent, par exemple, convertir en chaîne de caractère pour modifier un objet avant de l'évaluer à nouveau dans son type inital.

On voit donc poindre à l'horizon un point interessant du RPL, il permet contrairment au RPN de manipuler des objets de différents type (scalaire, vecteur, matrice, liste, chaine de caractères, entier long, nombre binaire/hexa, nombres complexes, expression algébrique, programmes, etc), mais la majorité des instructions et opérande qu'il utilisent ne sont pas définies pour tous ces types, et parmi lesinstruction les plus 'universelles', celles qui sont définit pour pratiquement tous les types possibles, rares sont celles qui le sont égalemement pour des arguments de type croisés.

Le CATALOG des instructions RPL n'est pas exhaustif, dans le sens ou chaque instruction n'est implémenté que pour un jeu d'arguments de type définis et non pour tous les jeuxd'arguments de type quelconques.

Il est tard, je vous laisse méditer sur ce point quasi-philosophique du RPL, qui partage là un aspect rencontré dans beaucoup de langage de programmation utilisant la notion de classe et en ce point, il diffère fondamentalement du LISP où tout est liste et uniquement liste ou atome.
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,je répondrai plus en détail demain...

Mais la plupart des choses que tu décris fonctionne _déjà_ en HP50

{ 12 13 14 } { 7 8 9 } MOD renvoie{ 5 5 5 }
{ 1 2 3 4 } { 5 6 7 8} R->C renvoie la bonne liste

SUM est en fait SLIST (Sigma LIST)
PROD est PiLIST (symbole Pi)

Note que STREAM permet de traiter toute liste par binome { 1 2 3 4 } << * >> STREAM donne 24 comme PiList

Pour ADD, je pense qu'HP a été bloqué a cause de la compatibilité ascendante. Autrement dit + aurait du être ADD et inversement,mais comme ils ont fait le choix que + servait à ajouter un élément dans une liste dès les 28 et 48 impossible de revenir en arriere.

"TRUC " 2 ADD
>=>
"TRUC 2"

2 "TRUC" ADD
>=>
"2 TRUC"

Dès qu'il n'agit pas sur une liste ADD fonctionne comme +

Il y a un chap sur le traitement "Parallel processing" dans le manuel avancé (AUR téléchargeable sur le site HP ou HPCALC je pense)... En gros tout ce qui est possible (logique) fonctionne. Par exemple : (0,0) {(1,1) (3,2)} LINE fonctionne et trace 2 lignes partant de (0,0).Pas testé mais je suppose que {(0,0) (3,3)} {(1,1) (3,2)} LINE aussi comme l'exemple de STO que je donnais avant : 0 {A B C} STO met 0 dans A B et C. Mais { 1 2 3} { A B C } STO mais 1 dans A, 2 dans B et 3 dans C

En fait le RPL fonctionne très souvent comme tu dis souhaiter qu'il fonctionne (ou comme je crois comprendre ce que tu dis ;)

Je vois ca de plus pres ce WE

Extrait du manuel avancé sur + et ADD et le pourquoi :
Group 4: ADD and +
* On HP 48S and HP 48SX calculators, the + command has been used to append lists or to append elements to
lists. Thus { 1 2 3 } 4 + returns { 1 2 3 4 }. With the advent of parallel processing in the HP 48G
series, the ADD command was created to perform parallel addition instead of +.
This has several ramifications:
* To add two lists in parallel, you must do one of the following:
* Use ADD from the !´%LIST% menu.
* Create a custom menu containing the ADD command.
* Assign the ADD command to a user-defined key.
* User programs must be written using ADD instead of + if the program is to be able to perform direct parallel
processing, or written with + and applied to their arguments by using DOLIST. For example, programs such as «
→x 'x+2' » will produce list concatenation when x is a list rather than parallel addition, unless rewritten as «
→ x 'x ADD 2' »
* Algebraic expressions capable of calculating with variables containing lists (including those intended to become
user-defined functions) cannot be created in RPN syntax since using ADD to add two symbolic arguments
concatenates the arguments with + rather than with ADD. For example, 'X' DUP 2 ^ SWAP 4 * ADD
'F(X)' SWAP = produces 'F(X)=X^2+4*X' rather than 'F(X)=X^2 ADD 4*X'.
J'ai peut etre mis des DOLIST inutile au dessus.je vérifiérai.

Pour mieux comprendre

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

>=>

{ 0 0 1 1 0 1 0 1 0 0 }

Par contre si je veux extraire une sous-liste des nombres premiers de cette liste, je ne vois pas comment faire sans DOLIST. Ca se ferait comment en LISP ? ( PS en RPL je peux certes créer une commande genre PREMIER? qui fonctionnera comme je veux mais il y aura un DOLIST dedans)
PS : j'ai trouvé un moyen sans DOLIST :

{ 0 1 2 3 4 5 6 7 8 9 } DUP ISPRIME? SWAP IFT

>=> { 2 3 5 7 }


{ 0 1 2 3 4 5 6 7 8 9 } 1 ADD
>=>

{ 1 2 3 4 5 6 7 8 9 10 }
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 : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Bien pour l'astuce avec le IFT, cela donne le même système que dans MatLab, où pour éviter d'avoir à parcourir vecteurs et matrice, un système d'indices 'logiques' est utilisé.

Code : Tout sélectionner

>> N=0:9
N =
     0     1     2     3     4     5     6     7     8     9
>> isprime(N)
ans =
     0     0     1     1     0     1     0     1     0     0
>> N(ans)
ans =
     2     3     5     7
>> 
On peut donc utiliser directement N(isprime(N)) pour avoir la 'liste' (en fait un vecteur dans le jargon MatLab) { 2 3 5 7 }



Encore une fois, qu'il s'agisse du LOGO ou d'un autre type de language, le RPL permet assez facilement de s'adapter et de reproduire les spécificité (à condition de rester en 'polonaise inversé' pour en profiter encore plus simplement et sans complication).

On comprend pourquoi Bill Wickes et son équipe avait choisi cette solution inspirée du FORTH et du LISP pour créer le RPL.
Voir à ce sujet l'excellant article posté par zpalm :
viewtopic.php?f=46&t=28149
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.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: Programmer en RPL

Message par jxano »

J'aurais une petite objection :
Gilles59 a écrit :La commande DOLIST existe depuis la HP49, mais doit pouvoir être créée en RPL sur les28 et 48 (bon exercice)...
Cette commande est déjà présente sur les 48G, où elle apparaît avec toute une série de commandes typiquement « Lisp », comme HEAD (CAR en Lisp) et TAIL (CDR). DOLIST fonctionne comme MAPCAR, et on a également DOSUB qui copie MAPCDR en appliquant les traitements non pas sur chaque élément d'une liste, mais sur tous les restes de la liste où l'on a supprimé le premier élément, le premier et le second élément, les trois premiers éléments, etc. Étonnant, d'ailleurs, que ces fonctions fassent leur entrée presque 10 ans après la création du nom « Reverse Polish Lisp » !

Pour taquiner un peu, chasser est du premier groupe, mais manger, payer, piéger le sont également...
Programmeur abscons.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

J'ai regardé un peu plus hier soir dans la doc les notions de traitement parallèle de liste.

Y est expliqué les cas où on peut faire directement une opération parallélisée et les cas où on doit employer DOLIST.

De mémoire (et non exhaustif), on est obligé d'utiliser DOLIST dans les cas suivants

- Commande qui fonctionne sur un nombre variable d'argument (par exemple ->LIST)
- Commande qui fonctionne par défaut sur la liste (par exemple { 1 2 3 } STR-> donne "{1 2 3} " et pas {"1" "2" "3"} Idem pour SAME qui va vérifer l'égalité globale des 2 listes et pas l'égalité élément par élément
- Commande dont un des arguments est déjà une liste
- Utilisation de structure de programme de "branchement" (CASE , FOR , IF) (mais remarquez que la forme IFT fonctionne)
- ...

Bref il y a beaucoup de cas qui obligent l'utilisation de DOLIST

Pour en savoir plus: http://www.hpcalc.org/search.php?query=AUR+edition+2

Annexe F-1

La commande DOSUB est effectivement vraiment intéressante aussi ;)
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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2934
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Programmer en RPL

Message par zpalm »

A propos de RPL, connaissez-vous RPL/2 ?
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6188
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Programmer en RPL

Message par Marge »

zpalm a écrit :A propos de RPL, connaissez-vous RPL/2 ?

Pas l'temps, làààààààà. (tu es fou ou quoi? il va me falloir au moins deux ans pour lire ce fil jusqu'à ton billet ! et quant à le comprendre...) :pirat:
Répondre

Retourner vers « Tous les Pockets »