Simple programming help with the Prime
06-09-2014, 04:09 PM
Post: #1
 Ernesto Junior Member Posts: 6 Joined: Jun 2014
Simple programming help with the Prime
I am new to PPL and the HP Prime. I am converting many programs from RPL on the HP 48GX and trying to move over to the HP Prime. I am having trouble accessing the "stack" in code. Does anyone know how to do this? I am sure it may be simple but I have yet to figure this one out. Any help would be greatly appreciated.

Thanks,
Ernesto
06-09-2014, 04:39 PM
Post: #2
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
There are currently no functions callable from PPL that will manipulate the stack. However, parameters to programs can be pulled from the stack. The syntax on the entry line is
Code:
function_name(n)
where "n" is the number of arguments that should be popped off the stack and provided to the program. The return value from the program also ends up on the stack. If you want to return multiple values, the only option today is to return a list.

Lack of integration between PPL and the stack is somewhat dismaying to me. In addition, the fact that the type system can't determine on its own how many arguments to pop is yet another symptom of incomplete integration.

- John
06-09-2014, 05:13 PM (This post was last modified: 06-09-2014 05:14 PM by Tim Wessman.)
Post: #3
 Tim Wessman Senior Member Posts: 2,091 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 04:39 PM)John R. Graham Wrote:  addition, the fact that the type system can't determine on its own how many

So how would you propose handling cases where you can have any number of arguments such as the MIN function which can take 1-16? Limit it to 2 and lose functionality? How would you avoid automatic evaluation when selecting it from a menu in RPN mode and it would automatically take 2 numbers instead of the 5 you wanted? What about in the CAS where something like sin(1,2,3,4) is a perfectly valid input?

It isn't that it wasn't possible, we just couldn't answer the questions to a level that didn't impede operation in one way or another or would cause problems with later work. I am truly happy if someone can answer everything in a way that doesn't eliminate useful capability while still making it more automated. We just didn't see a way. I'd be truly happy if more brains could figure it out and propose a path forward.

TW

Although I work for the HP calculator group, the views and opinions I post here are my own.
06-09-2014, 05:55 PM
Post: #4
 Ernesto Junior Member Posts: 6 Joined: Jun 2014
RE: Simple programming help with the Prime
So for example if I wanted to create a program to add the 2 recent values on the stack would be function_name(2)? When you say function_name(n) this is the actual command? Or is it some name of MY custom function?
06-09-2014, 06:34 PM
Post: #5
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
Tim,

To me, in the context of an RPN machine, the answers to these questions seem pretty obvious. Also obvious is that I don't understand all of the complexities you're operating under. In any case, fairly asked. Here are my answers:
(06-09-2014 05:13 PM)Tim Wessman Wrote:  So how would you propose handling cases where you can have any number of arguments such as the MIN function which can take 1-16? Limit it to 2 and lose functionality?
If the MIN function takes as an argument the number of objects to compare, then that number should be placed on the stack prior to invoking MIN. RPN is (almost completely) postfix and any temptation to make the operator infix under certain circumstances should be resisted. The current implementation seems to me to be more for the convenience of making the menus more similar between RPN and Algebraic entry modes.
(06-09-2014 05:13 PM)Tim Wessman Wrote:  How would you avoid automatic evaluation when selecting it from a menu in RPN mode and it would automatically take 2 numbers instead of the 5 you wanted?
Note that this is a problem that's caused because of the decision to include an operand after the operator as described above. If the case above were implemented more in the true spirit of RPN, then this problem vanishes.
(06-09-2014 05:13 PM)Tim Wessman Wrote:  What about in the CAS where something like sin(1,2,3,4) is a perfectly valid input?
Not trying to be too glib here, but since CAS is not RPN or stack oriented, this seems like it's outside the domain we were discussing. Not that I don't want a true RPN CAS mode, but then that probably obviates the needs for CAS vs. Home, doesn't it?

- John
06-09-2014, 06:53 PM (This post was last modified: 06-09-2014 06:56 PM by eried.)
Post: #6
 eried Senior Member Posts: 712 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 06:34 PM)John R. Graham Wrote:  If the MIN function takes as an argument the number of objects to compare, then that number should be placed on the stack prior to invoking MIN. RPN is (almost completely) postfix and any temptation to make the operator infix under certain circumstances should be resisted. The current implementation seems to me to be more for the convenience of making the menus more similar between RPN and Algebraic entry modes.

100% agree with that. Using the number of args as an infix value is overly not-intuitive (not that RPN is intuitive for new users anyway). I am not sure if asking for the number of params as a stack argument is the solution either. Probably what the rpn mode needs is aliases for commands, like min takes 2, min3 takes 3, min4 ...

Right now, RPN in the prime is reduced to the same feeling has having toilet paper in the house storage. You don't use it, you don't need it right now but makes you feel ok that there is there.

My website: erwin.ried.cl
06-09-2014, 07:10 PM
Post: #7
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 05:55 PM)Ernesto Wrote:  So for example if I wanted to create a program to add the 2 recent values on the stack would be function_name(2)? When you say function_name(n) this is the actual command? Or is it some name of MY custom function?
Yes, correct. Append the "(2)" after the function name. I meant "function_name" merely as a placeholder for the name of your custom function.

- John
06-09-2014, 09:11 PM
Post: #8
 Ernesto Junior Member Posts: 6 Joined: Jun 2014
RE: Simple programming help with the Prime
OK. So let's assume I make a program named "ADD". In code, can I set up the program to automatically take a number to append. Such as. ADD() would automatically assume the first to vales instead of saying ADD(2).

Also when I begin my program:

Begin;

End;

Does this program just know to take the values from the "stack" automatically? It seems like I would need to store them as some variable within the program so they may be manipulated as need be...
06-09-2014, 09:22 PM
Post: #9
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
Not sure exactly what you mean, but let's assume that your add program wants to take two arguments from the stack, add them together, leaving the sum on the stack, then the code woule look like this:
Code:
EXPORT ADD(X,Y) BEGIN   RETURN X+Y; END;
and would be invoked as
Code:
ADD(2)
Does that make sense?

- John
06-09-2014, 09:36 PM
Post: #10
 Ernesto Junior Member Posts: 6 Joined: Jun 2014
RE: Simple programming help with the Prime
Yes it makes perfect sense. I am just trying to figure a clever way to run Add(x,y) without without typing the (x,y) value if that makes sense. Ultimately I would like to create a "shortcut" and assign it to one of the tabs at the top, maybe called ADD. It refers to a custom program Add(2) that takes the 2 values and adds them.

Maybe something like this:

Begin;
End;
06-09-2014, 09:46 PM (This post was last modified: 06-09-2014 09:51 PM by Didier Lachieze.)
Post: #11
 Didier Lachieze Senior Member Posts: 1,135 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 09:22 PM)John R. Graham Wrote:  Not sure exactly what you mean, but let's assume that your add program wants to take two arguments from the stack, add them together, leaving the sum on the stack, then the code woule look like this:
Code:
EXPORT ADD(X,Y) BEGIN   RETURN X+Y; END;
and would be invoked as
Code:
ADD(2)
Does that make sense?

- John

It seems there has been some changes with the latest firmware update because now in RPN mode you don't need anymore to specify the number of arguments when calling a User program, with your program example:
Code:
2 ENTER 3 ADD() ENTER
returns 5.

However in algebraic mode you still need to call your program with:
Code:
ADD(2,3) ENTER
to get 5.
06-09-2014, 09:47 PM (This post was last modified: 06-09-2014 10:01 PM by John R. Graham.)
Post: #12
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 09:36 PM)Ernesto Wrote:  Yes it makes perfect sense. I am just trying to figure a clever way to run Add(x,y) without without typing the (x,y) value if that makes sense. Ultimately I would like to create a "shortcut" and assign it to one of the tabs at the top, maybe called ADD. It refers to a custom program Add(2) that takes the 2 values and adds them.

Maybe something like this:

Begin;
End;
Alas, such shortcut soft key assignments are not yet available to users[1], although they make so much sense, I do expect them to show up at some point.

- John

1. Except through brute force manual graphical design / touch screen interpretation. Even then, you have to be running the program that does all that display & touch work: it's not possible to make it available from Home.
06-09-2014, 10:04 PM (This post was last modified: 06-09-2014 10:22 PM by John R. Graham.)
Post: #13
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 09:46 PM)Didier Lachieze Wrote:  It seems there has been some changes with the latest firmware update because now in RPN mode you don't need anymore to specify the number of arguments when calling a User program, with your program example:
Code:
2 ENTER 3 ADD() ENTER
returns 5.
Didier, thank you. That's good to know (and a distinct improvement, in my opinion).

- John
06-09-2014, 10:28 PM
Post: #14
 Didier Lachieze Senior Member Posts: 1,135 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 10:04 PM)John R. Graham Wrote:  Didier, thank you. That's good to know. Did you see that documented somewhere? I had to be told about the "argument count" convention by other forum members as there didn't appear to be any official documentation of the mechanism.

- John

See the HP Prime User Guide pages 49-50 "Sample calculations", it explains why the argument count is required for functions that have a variable number of arguments such as MIN. I have not seen any other reference to required argument count in RPN mode.
06-09-2014, 11:26 PM
Post: #15
 John R. Graham Member Posts: 76 Joined: Dec 2013
RE: Simple programming help with the Prime
Thanks. I must've missed that. But in a conversation I had with Han, I think he implied that the argument count was mandatory on all functions that took any arguments.

- John
06-10-2014, 09:52 AM
Post: #16
 Joe Horn Senior Member Posts: 1,454 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-09-2014 11:26 PM)John R. Graham Wrote:  Thanks. I must've missed that. But in a conversation I had with Han, I think he implied that the argument count was mandatory on all functions that took any arguments.

- John

It's mandatory only on those functions that take a variable number of arguments. If a function always takes n arguments, then n need not be specified.

It's kinda similar to RPL: DUP2 always takes 2 arguments, so you don't need to tell it to take 2 arguments. But DUPN takes n arguments, so you must specify n. In PPL, ABS always takes 1 argument, so you don't need to tell it to take 1 argument. But the MAX command can take many arguments, so MAX should be thought of as MAXN when you're in RPL mode, because you have to specify n.

Hope that helps!

<0|ɸ|0>
-Joe-
06-10-2014, 09:59 AM (This post was last modified: 06-10-2014 11:23 AM by Angus.)
Post: #17
 Angus Member Posts: 212 Joined: Feb 2014
RE: Simple programming help with the Prime
I tried to program an adoption of dealing with different number bases. Inspired by the hp42c menu.
What I ended up with about stack manipulations is something like the following as a return value:

In a program
(...)
RETURN " 32 4 R→B(3)"; //hex interpretation
(...)

That works. But not really satisfying. Behaviour seems to have changed after the latest patch. I opened a post, but there were no answers. Maybe I will split it up into smaller subposts.

If you enter 123 <enter> and press the user key (actually I'm working on soft-menu hence my request for static softkey assignment) that does the 2hex command you have 123 on the stack and 32 4 R->B(3) on the entry line. So you have to confirm with enter again and it is done.

You can in a way 'put' data on the stack as a string like this. But that is far from RPN entry. :-(
How can you pass the entry line to the parser from a program? Having to press enter is nonsense rpn-wise?
06-10-2014, 11:49 AM (This post was last modified: 06-10-2014 12:04 PM by Didier Lachieze.)
Post: #18
 Didier Lachieze Senior Member Posts: 1,135 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-10-2014 09:59 AM)Angus Wrote:  In a program
(...)
RETURN " 32 4 R→B(3)"; //hex interpretation
(...)

I may not understand what your program is trying to accomplish but maybe you can use something like that:
Code:
EXPORT tohex(X) BEGIN   RETURN (R→B(X,32,4)); END;

then in RPN interactive mode: 123 [ENTER]* tohex() will return #7Bh
in algebraic interactive mode: tohex(123) will return #7Bh
at the end of a user program: RETURN tohex(123); will return #7Bh

* you may skip ENTER, 123tohex() on the command line works as well
06-10-2014, 02:10 PM
Post: #19
 Angus Member Posts: 212 Joined: Feb 2014
RE: Simple programming help with the Prime
I was trying to use the Stack.
Your code works nicely when calling tohex() as written, thank you! I will forget my way in the future.
I try to call tohex() from within an other program I have problems. I want to launch a menufor conversion but suppose I just wanted to have a user key on shift+minus for hex conversion.

KEY KS_Minus()
BEGIN
LOCAL reval;
retval:=tohex(1); //this gives an error when called without number of pops retval();
RETURN retval;
END;

However if I hit shift+minus the function app is started... Any ideas what I am doing wrong?
06-10-2014, 04:39 PM (This post was last modified: 06-10-2014 09:46 PM by Didier Lachieze.)
Post: #20
 Didier Lachieze Senior Member Posts: 1,135 Joined: Dec 2013
RE: Simple programming help with the Prime
(06-10-2014 02:10 PM)Angus Wrote:  KEY KS_Minus()
BEGIN
LOCAL reval;
retval:=tohex(1); //this gives an error when called without number of pops retval();
RETURN retval;
END;

However if I hit shift+minus the function app is started... Any ideas what I am doing wrong?

What happens is that tohex(1) returns #1h as 1 is not considered as an argument count but as a parameter for tohex().

Normally, according to the HP Prime User Guide when you define a USER Key the RETURN statement should be followed by a string containing the command to be put on the command line. (Btw it seems there is no way to execute automatically the string once it’s on the command line).

What’s interesting in your example is that retval is not a string but the number '1' and RETURN retlval; is activating the Symb function as if you had pressed the Symb key.

I’ve done a few tests and each key has a corresponding number which reproduces the key press including the execution of the function:
• 0 to 50 for the unshifted key
• 0 for the Apps key
• 1 for the Symb key
• 5 for the Home key
• 6 for the Plot key
• ..
• 10 for the CAS key
• 14 for the Vars key
• ..
• 50 for the + key,
• 51 to 101 for the shifted keys
• 51 for the Info key
• 101 for the Ans key
• 102 to 152 for the Alpha keys (upperscript)
• 116 for the A key
• ….
• 152 for the ; key
• 153 to 203 for the Alpha keys (lowerscript)
• 167 for the a key
• ….
• 203 for the ; key

I don't know if that can be useful in any way ...
 « Next Oldest | Next Newest »

User(s) browsing this thread: 2 Guest(s)