[RPL/2] Please explain this behaviour

BERTRAND Joël joel.bertrand at systella.fr
Ven 14 Déc 19:12:19 CET 2007


DEMAINE Benoit-Pierre wrote:
> Adrian Blake wrote:
>> RPL/2> clear
>> RPL/2> { 2 3 + } list-> drop eval
>>
>> as expected, good
> 
> Yes.

	Yes, but it is a side effect (and very strange, but I have verified
this afternoon on my 28S and my 48SX, and I can obtain the same result).
There is no reason to put in stack a function.

>> RPL/2> { 3 4 * } list-> drop eval
>>
>> also as expected, good
> 
> yes.

	Same remark.

>> RPL/2> { 2 3 { 3 4 * } + + } list-> drop eval
>> +++Error : Invalid argument type for << { 2 3 { 3 4 * } + + } list-> drop eval >> command
>> result should be 17
> 
> No. You are wrong, the error is right.

	Yes, isn't it ? ;-)

>> or should it be this
>> { 2 3 { 3 4 * } list-> drop eval + + } list-> drop eval
>>
>> no ..fails
>>
>> So what is the correct syntax?
> 
> A list is not a program.
> 
> It may work if you wrote
> << 2 3 { 3 4 * } + + >>

	Your expression cannot be evaluated because you try to add an integer
(3) and a list ({ 3 4 * }). You can write:

	<< 2 3 { 3 4 * } list-> drop eval + + >>

but I don't understand why you don't use

	<< 2 3 << 3 4 * >> eval + + >>

Any explanations ?

> because this way, you put things in stack, and evaluate them one after
> the other.
> 
> But, perform steps one by one, by hand in CLI, put the list, then
> execute list->, and you will see that after DROP, the first 2 elements
> of the stack are the last two objets of the list, twice a plus.
> 
> Since a plus takes as argument "two values", givving this command as
> argument a command can not work: you can not add the plus sign to a
> value. You can only add '+' to an array.
> 
> In the best case, you could hope to EVAL
> 
> 3: { 3
>      4
>      * }
> 2: +
> 1: +

	If you try to evaluate this one, RPL/2 gives you an error. You have to
write { 3 4 * } { + } + to obtain { 3 4 * + }. '+' requires two lists as
arguments in this case.

> and get
> 
> 1: { 3
>      4
>      *
>      + }
>
> Thats would make sense to me. But, in any case, you can NOT hope getting
> a number as result to this.
> 
> Bcause when you arrive at the EVAL step, the stack has at the bottom two
> '+' operators.
> 
> It's not a syntax problem, but a design problem (or, YOU not
> understanding the RPL objects).
> 
> RPL is somehow commutative. But, not the way you think.
> 
> { 2 3 { 3 4 * } + + } list-> drop eval
> has NO WAY to ever work.
> 
> Any way, type just
> 2 3 { 3 4 * } + +
> and you will also get an error.
> 
> I dont really guess what you intend to do; I can not see your point, or
> guess how any modification of your example could lead to anything
> interesting.
> 
> Before posting the ML, please, try manually your commands. If you had type
> { 2 3 { 3 4 * } + + } list-> drop eval
> manually step by step, you would have seen the problem immediately:
> evaluating:
> 3: { 3
>      4
>      * }
> 2: +
> 1: +
> CAN NOT lead to what you had in mind, what ever it was.
> 
> Did you ever use HP calculators ? Maybe you should read some RPL
> tutorial on the web if there is any; maybe on http://www.hpcalc.org/ You
> are having a very basic problem, generic to RPL, not specific to the
> implementation by Bertrand. Your thing should faile the same way on HP
> machines (I just would have expecte the result to be a list containing
> '+' in the end).
> 

	Regards,

	JKB


Plus d'informations sur la liste de diffusion RPL2