HP Forums
Programing advice please (50g) - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: General Forum (/forum-4.html)
+--- Thread: Programing advice please (50g) (/thread-20129.html)



Programing advice please (50g) - mchris - 06-30-2023 03:51 PM

I need a method in RPN mode to SWAP x and y registers if x>y. I prefer full RPN without IF THEN ELSE END structures. I try « DUP2 > SWAP IFT » but it always ended with one element on the stack. Any advice?

Thank you.


RE: Programing advice please (50g) - Nigel (UK) - 06-30-2023 04:11 PM

The SWAP needs to be in program quotes << SWAP >> so it gets put on the stack for IFT to execute. Without them it gets executed before IFT is reached.

Nigel (UK)


RE: Programing advice please (50g) - FLISZT - 06-30-2023 04:25 PM

Hi,


You can try one of these solutions too:

<< DUP2 > {SWAP} IFT >>

<< DUP2 > :: SWAP IFT >>


RE: Programing advice please (50g) - mchris - 06-30-2023 04:39 PM

Thank you all, it worked but I struggle to understand it Smile


RE: Programing advice please (50g) - DavidM - 06-30-2023 04:46 PM

To save a few bytes you could avoid the use of IFT altogether:
Code:
\<<
    DUP2
    MIN
    UNROT
    MAX
\>>



RE: Programing advice please (50g) - FLISZT - 06-30-2023 07:24 PM

(06-30-2023 04:39 PM)mchris Wrote:  Thank you all, it worked but I struggle to understand it Smile

The regular syntax - as mentioned by Nigel (UK) - is:
Code:
<< TEST << … … >> IFT >>
            ↑
    if the test is true
or
Code:
<< TEST << … >> << … >> IFTE >>
           ↑       ↑
the test is true   the test is false

But instead of instructions inside chevrons, you can use lists (at least with hp-48GX … 50G / not with hp-28):
Code:
<< TEST { … … } { … … } IFTE >>
… generally, this syntax is faster than the one with chevrons (and lighter if my memory serves me right).

It's also possible to use a TAG :: before ONE instruction.
For example:
<< DUP2 > :: SWAP :: DROP2 IFTE >>

Last but not least example:
<< 1 == << 9 'l' STO+ >> IFT >>
… add 9 to the register l, if the value on the stack is equal to 1.

But… writing 'l' is impossible inside a list.
So, if you want use lists, the only solution I know of is that one (with a TAG):
<< 1 == { 0 ::l STO+ } IFT >>

I hope I'm clear enough…
Anyway, DavidM's solution to your question is the best. Smile

Edit: typo


RE: Programing advice please (50g) - Joe Horn - 06-30-2023 08:41 PM

A 3-step solution: << MAX LASTARG MIN >>. This assumes the default setting for flag -55 (Save Last Args) which almost everybody leaves that way.


RE: Programing advice please (50g) - rprosperi - 06-30-2023 09:38 PM

(06-30-2023 04:39 PM)mchris Wrote:  ...it worked but I struggle to understand it Smile

This is the fundamental nature of RPL when learning it.... Smile


RE: Programing advice please (50g) - Gil - 07-01-2023 12:48 AM

To get the result,
in the following order
minVal (first place) maxVal (second place ,
in Joe Horn program,

invert the command MAX and MIN as follows:

<< MIN LASTARG MAX >>