C.Ret a écrit : ↑25 janv. 2023 18:16
FLISZT a écrit : ↑24 janv. 2023 19:37EVAL existe en LISP… et je suppose fortement que cette instruction trouve son origine dans ce langage.
Mais, c'est à cause de cet affiliation avec le Lisp, que je ne présente jamais un code RPL avec des guillemets '»' orphelines. Je regroupe toujours les symboles de 'fermeture' en fin de ligne avec du contenu. Car, si je ne me trompe pas, en Lisp, la parenthèse fermante orpheline est strictement interdite.
Le Lisp, d'après ce que j'en ai retenu, n'a jamais été normalisé contrairement à ces sucesseurs directs : le Common Lisp ou le Scheme.
Le seul Lisp dont je dispose est un Common Lisp GNU sous Linux.
Pour ce qui est de la parenthèse orpheline, je ne sais pas trop. J'ai donc ouvert une fenêtre système sur mon portable et lancé "clisp".
.
- CLISP.png (43.97 Kio) Vu 2377 fois
Apparemment, une parenthèse fermante isolée en début de ligne ne pose (ici… ) pas de problème.
C.Ret a écrit : ↑25 janv. 2023 18:16
Ainsi, j'aurai présenté le programme RPL publié ci-dessus de cette façon:
Code : Tout sélectionner
« « → n « IF n 100 > THEN n 10 − @ déclaration de la fonction: ←Mc
ELSE n 11 + ←Mc EVAL ←Mc EVAL END » » → ←Mc « ←Mc EVAL » » @ appel de la fonction
En tout cas, cette idée de présentation, ne serait-ce que d'un point de vue visuel, … j'aime bien !
C'est vrai que mon programme ressemble à celui de
cgh. Ça vient probablement du fait que tous les deux (mais aussi
gege, entre autres, avec son prog pour TI-89) avons écrit un programme qui "colle" à la définition de la fonction.
Je dirais aussi que ça correspond à ma manière de programmer en RPL : je préfère le côté Lisp du RPL à son côté Forth, même si ce dernier peut s'avérer bien pratique.
Mon programme a quand même une différence notable d'avec celui de
cgh, c'est l'utilisation d'une variable locale au sein même de la fonction. Comme, de plus, la fonction s'appelle elle-même, cette dernière doit être stockée dans une variable locale compilée.
Bien que peut-être plus complexe en apparence, mon programme avec la valeur 1 prend 1,66 s contre 2,04 s pour celui proposé par
cgh.
J'ai écrit une version utilisant la struture
test {…} {…} IFTE, mais je ne l'ai pas publiée. Elle ne semblait pas plus rapide ( … moins (!) je viens d'en avoir la confirmation : 1,68 s),
Pour info, la version algébrique prend 20,55 s !! (toujours avec 1)
Dans les MPO d'antant (ceux des magazines) le facteur temps était aussi pris en compte.
Avec la version RPL 100% algébrique (étonnament lente), celles de
cgh, de
Gilles59 et la tienne (
C.Ret) 100% "stack" (1,18 s), il ne doit pas rester beaucoup d'autres possibilités en RPL… faudrait que je me mette au sysRPL.
La version avec
MAX est un peu de la triche dans le sens où ce n'est pas une traduction de la fonction mais une interprétation basée sur les résultats - heureusement qu'il n'y en a que deux… - obtenus avec cette fonction. C'est une lecture "après coup".
Mais bon ça fait une version de plus !
C.Ret a écrit : ↑25 janv. 2023 18:16
Tout à fait, et je pense que c'est à cause de cette inspiration mutuelle que certains appellent le RPL (Reverse Polish Lisp). Je n'aime pas cette dénomination car le RPL est par trop d'aspect très diffèrent Lisp, notamment par son fondement procédural. Alors que le Lisp est surtout un language fonctionnel.
Selon William C. Wickes, lui-même, RPL veut dire Reverse Polish Lisp. D'autres, comme Charles Patton (Theo dans
Les Tontons Flingeurs : « C'est pas ma marque préférée ! »
) ont parlé de ROM-based Procedural Language.
Les deux explications semblent tenir la route :
- il y a bien du Lisp dans le RPL mais à la mode "reverse" (quoique pas à 100%, notamment au niveau des structures de branchement) ;
- la deuxième signification est liée au fonctionnement interne du RPL (appels de routinesen ROM).
Donc… en même temps !
PS : mes mesures ont été effectuées sur hp-50g (la noire).
Ce n'est pas facile de chronométrer un programme contenant une fonction qui s'appelle elle-même…
Je suis donc passé par un autre programme :
Code : Tout sélectionner
<<
1 @ n = 1
TICKS SWAP
nom_prog_à_chronométrer
TICKS ROT
− B→R
8192 /