HP Forums
Calling the contents of an identifier - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: Calling the contents of an identifier (/thread-7933.html)



Calling the contents of an identifier - compsystems - 03-13-2017 01:45 AM

Hello

It is common within a program to store an identifier inside another identifier and then store an object within the contents of the last ID, I have not currently been able to do this in HPP-PL

X:=0; [ENTER] 0
sto('X+1',F1); [ENTER]
F1; [ENTER] 'X+1' // ok
FunctionUserAppVar:='F2'; [ENTER] F2 // OK
sto('X+2',FunctionUserAppVar); [ENTER] // 2 =(

I think the first argument ('X+2') if it is enclosed in quotation marks should not be evaluated 0+2 -> 2, Should be kept 'X+2'

Now the second argument, should be able to be controlled with eval CMD Or with a new RECALL command, to call n times your content.

ID1:= 'ID0'
ID:='ID1'

eval(ID,1) == recall 1 time -> ID1
eval(ID,2) == recall 2 times etc -> ID0

sto('X+2',eval(FunctionUserAppVar,1) ); == sto('X+2', 'F2') == (F2:='X+2')


RE: Calling the contents of an identifier - Han - 03-13-2017 03:16 AM

Code:

local casName:="F2";
CAS(EVAL(casName + ":='X+2'"))



RE: Calling the contents of an identifier - compsystems - 03-13-2017 10:29 PM

In CAS MODE, does not work, evaluates the USER variables, (A, ... Z, L0-L9, M0-M9, etc.) I keep insisting that the quotation marks should be not evaluated the expression.

//CAS MODE with X uppercase
X:=0;
symbExpr:='X+1';
var:="FF1";
CAS( EVAL ( var + "(X):=" + symbExpr ) ); // FF1(X):=1
FF1(2); // RETURNS 1 evaluates X =(

//HOME MODE with X uppercase
X:=0;
symbExpr:='X+1';
var:="FF1";
CAS( EVAL (var + "(X):=" + symbExpr )); // FF1(X):='X+1'
FF1(2); // RETURNS 3 OK

//CAS MODE with x lowercase
purge(x);
symbExpr:='x+1'; // or symbExpr:=x+1;
var:="FF2";
CAS( EVAL ( var + "(x):=" + symbExpr ) ); // FF2(x):='x+1'
FF2(2); // RETURNS 3 OK

At least I was able to execute INPUT CMD from a CAS PRG
run PRGCAS();

PHP Code:
export resetFunctionAppVarsvarApp_str )
BEGIN
  expr
"Function." varApp_str ":=0"); // "" = "No definition in Symbolic view"
  
return "Done";
END;


#cas
  
PRGCAS():= 
  
BEGIN
    SetFunctionAppVars
"F1" );
    
SetFunctionAppVars"F2" );
    
// ....
    
return("Done");
  
END;
#end

export SetFunctionAppVarsvarApp_str )
BEGIN
  local symbExpr
resetVALUE_FXinitVALUE_FX;
  
IFERR
    initVALUE_FX 
:= EXPRvarApp_str );
  
THEN
    initVALUE_FX 
:= 0
  
END
  
resetVALUE_FX := 'X^2/9';
  
local ObjectType_SymbolicExpression := 8;
  if 
  (
    
input
    { { 
symbExpr, [ ObjectType_SymbolicExpression ] } }, 
    
"Set Function App Vars",
    
varApp_str+"(X):",
    
"Enter Symbolic Expression for "+varApp_str+"(X)",
    
resetVALUE_FX
    
initVALUE_FX
    
)
  )
  
then
    expr
("Function." varApp_str ":='" symbExpr "'");
    
//CAS( EVAL(varApp_str + "(X):=" + symbExpr) );
    //return( { varApp_str, symbExpr, varApp_str + "(X):=" + symbExpr,  varApp_str + ":='" + symbExpr + "'" });
  
end;
END



RE: Calling the contents of an identifier - Han - 03-14-2017 12:51 AM

Your program seems extremely convoluted. There is no reason to request a "type 8" object when you are simply going to treat the input as a string anyway. (In other words, why not just use strings?) Also, why create a CAS program that does nothing but call non-CAS programs? A more straightforward approach is to simply do it all in non-CAS programs.

Don't use EXPR() if you don't want variables evaluated. Use CAS() instead.

Code:
export resetFunctionAppVars( varApp_str )
BEGIN
  EXPR(EVAL(varApp_str + ":=" + string(""))); 
  return("Done");
END;

export SetFunctionAppVars( varApp_str )
BEGIN
  local symbExpr, resetVALUE_FX, initVALUE_FX;
  IFERR
    initVALUE_FX := string(EXPR(varApp_str));
  THEN
    initVALUE_FX := "";
  END;
  resetVALUE_FX := "X^2/9";

  if 
  (
    input( 
    { { symbExpr, [ 2 ] } }, 
    "Set Function App Vars",
    varApp_str+"(X):",
    "Enter Symbolic Expression for "+varApp_str+"(X)",
    resetVALUE_FX, 
    initVALUE_FX
    )
  )
  then
    CAS(EVAL(varApp_str + ":=(X)->" + symbExpr));
    return(1); 
  end;
  return(0);
END;

EXPORT PRGCAS()
BEGIN
    SetFunctionAppVars( "F1" );
    SetFunctionAppVars( "F2" );
    return("Done");
END;



RE: Calling the contents of an identifier - mark4flies - 03-16-2017 01:10 AM

(03-13-2017 01:45 AM)compsystems Wrote:  It is common within a program to store an identifier inside another identifier and then store an object within the contents of the last ID

That claim is rather broad. I have never used such a construct. Not in a system like the HP Prime.


RE: Calling the contents of an identifier - mark4flies - 03-16-2017 01:18 AM

(03-13-2017 10:29 PM)compsystems Wrote:  In CAS MODE, does not work, evaluates the USER variables, (A, ... Z, L0-L9, M0-M9, etc.) I keep insisting that the quotation marks should be not evaluated the expression.

Well, that behavior is not how the HP Prime works. 'Insisting' won't change anything. Have you considered learning how the HP Prime works and developing your programs accordingly?


RE: Calling the contents of an identifier - compsystems - 03-16-2017 03:22 AM

(03-14-2017 12:51 AM)Han Wrote:  ...There is no reason to request a "type 8" object when you are simply going to treat the input as a string anyway. (In other words, why not just use strings?) Also, why create a CAS program that does nothing but call non-CAS programs? A more straightforward approach is to simply do it all in non-CAS programs.

Hola/Hi Han,
El INPUT CMD no trabaja dentro de un CAS MODE, por esta razón hay que crear una función o programa tipo HOME,

No me gusta trabajar con cadenas para expresiones simbólicas matemáticas , pues me parece que es una forma primitiva de programacion, solo las uso en casos extraordinarios.


[eng -Translation by google ]The INPUT CMD does not work within a CAS MODE, for this reason you have to create a function or program type HOME,

I do not like working with strings for symbolic mathematical expressions, as it seems to me that it is a primitive form of programming, I only use them in extraordinary cases.

If there is a type 8, for symbolic expressions, it would have to work.


RE: Calling the contents of an identifier - Han - 03-16-2017 01:25 PM

(03-16-2017 03:22 AM)compsystems Wrote:  [eng -Translation by google ]The INPUT CMD does not work within a CAS MODE, for this reason you have to create a function or program type HOME,

Yes, this is correct.

Quote:I do not like working with strings for symbolic mathematical expressions, as it seems to me that it is a primitive form of programming, I only use them in extraordinary cases.

The string is used for indirection (i.e. indirect storing/declaration of a variable whose name is saved as another variable) and for non-evaluation of expressions. A pair of single quotes will only prevent one level of evaluation, whereas you need several levels of non-evaluation (especially so, since you are using the EXPR() command). This is why it should be done using strings. Moreover, your expression is merely a formula. I agree that symbolic manipulation is best done using expressions, but in this case you are not doing any symbolic manipulation. Instead, you are merely declaring a formula.

Once you have set up F1, F2, etc., creating a CAS program to do actual symbolic manipulation would be a perfectly fine approach.

Quote:If there is a type 8, for symbolic expressions, it would have to work.

Type 8 is quite limited in the Home view. It is mostly there for display purposes (for example, when viewing CAS objects in the Home view) and not for any real symbolic manipulation. So while you could achieve what you want using type 8 objects, a direct approach would be to use strings in conjunction with the CAS() command since your program is a "Home" program. This would also lower the chances of issues with evaluation.