// -*- mode:C++ ; compile-command: "g++ -I.. -g -c rpn.cc" -*-
/*
* Copyright (C) 2001,2014 B. Parisse, Institut Fourier, 38402 St Martin d'Heres
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef _GIAC_RPN_H
#define _GIAC_RPN_H
#include "first.h"
#include "gen.h"
#include "vecteur.h"
#include
#include
#undef _ABS // for SunOS
#ifndef NO_NAMESPACE_GIAC
namespace giac {
#endif // ndef NO_NAMESPACE_GIAC
std::string printasconstant(const gen & feuille,const char * sommetstr,GIAC_CONTEXT);
extern const unary_function_ptr * const at_INTERSECT;
extern const unary_function_ptr * const at_MINUS;
extern const unary_function_ptr * const at_UNION;
extern const unary_function_ptr * const at_rpn;
gen _rpn(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_alg;
gen _alg(const gen & args,GIAC_CONTEXT);
std::string enmajuscule(const std::string & s);
gen _PERCENT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_PERCENT;
void roll(int i,vecteur & v);
void ROLL(int i,GIAC_CONTEXT);
gen _ROLL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ROLL;
void rolld(int i,vecteur & v);
void ROLLD(int i,GIAC_CONTEXT);
gen _ROLLD(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ROLLD;
void stack_swap(vecteur & v);
void SWAP(GIAC_CONTEXT);
gen _SWAP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_SWAP;
void dup(vecteur & v);
gen _DUP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_DUP;
void over(vecteur & v);
gen _OVER(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_OVER;
void pick(int i,vecteur & v);
gen _PICK(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_PICK;
void drop(vecteur & v);
gen _DROP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_DROP;
gen _NOP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_NOP;
gen _IFTE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_IFTE;
gen _RPN_LOCAL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_LOCAL;
gen _RPN_FOR(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_FOR;
gen _RPN_WHILE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_WHILE;
gen _RPN_UNTIL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_UNTIL;
gen _RPN_CASE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_CASE;
gen _RCL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RCL;
gen _VARS(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_VARS;
gen purgenoassume(const gen & args,const context * contextptr);
gen _purge(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_purge;
gen _rpn_prog(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_rpn_prog;
vecteur rpn_eval(const vecteur & prog,vecteur & pile,GIAC_CONTEXT);
vecteur rpn_eval(const gen & prog,vecteur & pile,GIAC_CONTEXT);
gen _division(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_division;
gen _binary_minus(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_binary_minus;
vecteur tab2vecteur(gen tab[]);
extern const unary_function_ptr * const at_SIN ;
extern const unary_function_ptr * const at_COS ;
extern const unary_function_ptr * const at_TAN ;
extern const unary_function_ptr * const at_EXP ;
extern const unary_function_ptr * const at_LN ;
extern const unary_function_ptr * const at_DELTALIST ;
extern const unary_function_ptr * const at_PILIST ;
extern const unary_function_ptr * const at_HPSUM ;
extern const unary_function_ptr * const at_SIGMALIST ;
extern const unary_function_ptr * const at_HPDIFF ;
extern const unary_function_ptr * const at_HPINT ;
extern const unary_function_ptr * const at_Fahrenheit2Celsius;
extern const unary_function_ptr * const at_Celsius2Fahrenheit;
extern const unary_function_ptr * const at_polar_complex;
extern const unary_function_ptr * const at_ggb_ang;
extern const unary_function_ptr * const at_HDigits;
extern const unary_function_ptr * const at_HFormat;
extern const unary_function_ptr * const at_HComplex;
extern const unary_function_ptr * const at_HAngle;
extern const unary_function_ptr * const at_HLanguage;
// extern const unary_function_ptr * const at_testfunc;
extern const unary_function_ptr * const at_FREEZE;
extern const unary_function_ptr * const at_LINE;
extern const unary_function_ptr * const at_RECT;
extern const unary_function_ptr * const at_TEXTOUT;
extern const unary_function_ptr * const at_EDITMAT;
extern const unary_function_ptr * const at_INT;
#ifdef GIAC_HAS_STO_38
extern const unary_function_ptr * const at_INVERT;
extern const unary_function_ptr * const at_BLIT;
extern const unary_function_ptr * const at_GETPIX;
extern const unary_function_ptr * const at_DIMGROB;
extern const unary_function_ptr * const at_SUBGROB;
extern const unary_function_ptr * const at_GETPIX_P;
extern const unary_function_ptr * const at_PIXON_P;
extern const unary_function_ptr * const at_PIXOFF_P;
extern const unary_function_ptr * const at_LINE_P;
extern const unary_function_ptr * const at_RECT_P;
extern const unary_function_ptr * const at_INVERT_P;
extern const unary_function_ptr * const at_BLIT_P;
extern const unary_function_ptr * const at_TEXTOUT_P;
extern const unary_function_ptr * const at_DIMGROB_P;
extern const unary_function_ptr * const at_ARC_P;
extern const unary_function_ptr * const at_SUBGROB_P;
extern const unary_function_ptr * const at_GROBH;
extern const unary_function_ptr * const at_GROBW;
extern const unary_function_ptr * const at_GROBH_P;
extern const unary_function_ptr * const at_GROBW_P;
extern const unary_function_ptr * const at_ISKEYDOWN;
extern const unary_function_ptr * const at_STARTAPP;
extern const unary_function_ptr * const at_STARTVIEW;
#endif
gen _hp38(const gen & args,GIAC_CONTEXT);
gen _ABS(const gen & args,GIAC_CONTEXT);
gen _MODULO(const gen & args,GIAC_CONTEXT);
gen _RANDOM(const gen & g,GIAC_CONTEXT);
std::string printasRANDOM(const gen & feuille,const char * s,GIAC_CONTEXT);
gen _MAXREAL(const gen & g,GIAC_CONTEXT);
gen _MINREAL(const gen & g,GIAC_CONTEXT);
gen _EXPM1(const gen & g,GIAC_CONTEXT);
gen _LNP1(const gen & g,GIAC_CONTEXT);
gen _ADDROW(const gen & args,GIAC_CONTEXT);
gen _ADDCOL(const gen & args,GIAC_CONTEXT);
gen _SCALE(const gen & g,GIAC_CONTEXT);
gen _SCALEADD(const gen & g,GIAC_CONTEXT);
gen _SWAPCOL(const gen & args,GIAC_CONTEXT);
gen _SUB(const gen & args,GIAC_CONTEXT);
gen _RANDMAT(const gen & args,GIAC_CONTEXT);
gen _REDIM(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_redim;
gen _REPLACE(const gen & args,GIAC_CONTEXT);
gen _EIGENVAL(const gen & args,GIAC_CONTEXT);
gen _EIGENVV(const gen & args,GIAC_CONTEXT);
gen _SIZE(const gen& args,GIAC_CONTEXT);
gen _INT(const gen & g,GIAC_CONTEXT);
gen _HPDIFF(const gen & args,GIAC_CONTEXT);
gen _HPINT(const gen & args,GIAC_CONTEXT);
gen _HPSUM(const gen & args,GIAC_CONTEXT);
gen _TAYLOR(const gen & args,GIAC_CONTEXT);
gen _POLYFORM(const gen & args,GIAC_CONTEXT);
gen _IS_LINEAR(const gen & args,GIAC_CONTEXT);
gen _SVD(const gen & args0,GIAC_CONTEXT);
gen _SVL(const gen & args0,GIAC_CONTEXT);
gen _SPECRAD(const gen & args0,GIAC_CONTEXT);
gen _SPECNORM(const gen & args0,GIAC_CONTEXT);
gen _COND(const gen & args0,GIAC_CONTEXT);
gen _rank(const gen & args,GIAC_CONTEXT);
gen _SCHUR(const gen & args,GIAC_CONTEXT);
gen _LQ(const gen & args0,GIAC_CONTEXT);
gen _LU(const gen & args0,GIAC_CONTEXT);
gen _QR(const gen & args0,GIAC_CONTEXT);
gen _XPON(const gen & g,GIAC_CONTEXT);
gen _MANT(const gen & g,GIAC_CONTEXT);
gen _HMSX(const gen & g0,GIAC_CONTEXT);
gen _XHMS(const gen & g0,GIAC_CONTEXT);
gen _DEGXRAD(const gen & g,GIAC_CONTEXT);
gen _RADXDEG(const gen & g,GIAC_CONTEXT);
gen _PERCENT(const gen & g,GIAC_CONTEXT);
gen _PERCENTCHANGE(const gen & g,GIAC_CONTEXT);
gen _PERCENTTOTAL(const gen & g,GIAC_CONTEXT);
gen _ITERATE(const gen & args,GIAC_CONTEXT);
// gen _RECURSE(const gen & args,GIAC_CONTEXT);
gen _MAKEMAT(const gen & args,GIAC_CONTEXT);
gen _LSQ(const gen & args,GIAC_CONTEXT);
gen _idivis(const gen & args0,GIAC_CONTEXT);
gen _isprime(const gen & args0,GIAC_CONTEXT);
gen _ithprime(const gen & args0,GIAC_CONTEXT);
gen _euler(const gen & args0,GIAC_CONTEXT);
gen _numer(const gen & args0,GIAC_CONTEXT);
gen _denom(const gen & args0,GIAC_CONTEXT);
gen _ifactors(const gen & args0,GIAC_CONTEXT);
gen _binomial_icdf(const gen & args0,GIAC_CONTEXT);
gen _poisson_icdf(const gen & args0,GIAC_CONTEXT);
gen symb_RPN_LOCAL(const gen & a,const gen & b);
gen symb_RPN_FOR(const gen & a,const gen & b);
gen symb_RPN_WHILE(const gen & a,const gen & b);
gen symb_RPN_CASE(const gen & a);
gen symb_RPN_UNTIL(const gen & a,const gen & b);
gen symb_IFTE(const gen & args);
gen symb_NOP(const gen & args);
gen symb_rpn_prog(const gen & args);
gen _NTHROOT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_NTHROOT;
extern gen * rpn_ans() ;
gen _Ans(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Ans;
bool is_Ans(const gen & g);
gen _EXPORT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_EXPORT;
gen _VIEWS(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_VIEWS;
extern const unary_function_ptr * const at_POLYFORM;
extern const unary_function_ptr * const at_colSwap;
extern const unary_function_ptr * const at_replace;
extern const unary_function_ptr * const at_scale;
extern const unary_function_ptr * const at_scaleadd;
extern const unary_function_ptr * const at_schur;
extern const unary_function_ptr * const at_svl;
extern const unary_function_ptr * const at_swapcol;
extern const unary_function_ptr * const at_swaprow;
extern const unary_function_ptr * const at_mantissa;
extern const unary_function_ptr * const at_ldexp;
extern const unary_function_ptr * const at_frexp;
int is_known_name_home_38(const char * idname);
// 1 and 2 app or program variable, 3 home variable
int is_known_name_home_38(const char * name_space,const char * idname);
// add progname qualifier to variables in v and replace in g
void qualify(gen & g,const vecteur & v,const gen & prog,GIAC_CONTEXT);
// parse_program description: result is parsed, should be evaled
// assignation_by_equal: warning for probable misuse of = instead of :=
// undeclared_global_vars: regular 38 global variables used but not declared
// declared_global_vars: regular 38 global variables that were declared
// exported_function_names: list of exported function
// may contain description strings
// exported_variable_names: same as above but variables
// unknown_exported: function or variable exported but not used
// unexported: function local to source, re-qualified with progname namespace
// unexported_declared_global_vars: non regular 38 global variables,
// re-qualified with progname namespace
// views: is a matrix: column1 is the function name (no param) or integer,
// column2 is a comment string
// errors: exported names that are regular 38 home variables,
// and undeclared global variables that are not regular 38 variables
// return value is 0: ok, -1: invalid VIEWS, >0: #errors
// int parse_program(const wchar_t * source,const wchar_t * progname,vecteur & assignation_by_equal,vecteur & undeclared_global_vars,vecteur & declared_global_vars,vecteur & exported_function_names,vecteur & exported_variable_names,vecteur & unknown_exported,vecteur & unexported,vecteur & unexported_declared_global_vars,vecteur & views,vecteur & errors,gen & parsed,GIAC_CONTEXT);
// Prepares app sequence for computing a recurrence relation
// Valid if 1 sequence is checked and does not depend on other sequences
// Given expr_un, the expression of UK(N) in terms of UK(N-1) and UK(N-2)
// write the recurrence relation as UK(N)=subst(expr,vars,[N,UK(N-1),UK(N-2)])
// Return 0 if expr_un is invalid, 1 if it does not depend on UK(N-2)
// 2 otherwise
int seqapp_prepare(const gen & expr_un,gen & expr,vecteur & vars,GIAC_CONTEXT,int seqno=-1);
// Compute UK(N) for K=k to m, where UK(k) and UK(k+1) are given
// If the recurrence relation does not depend on UK(N-2), set UK(k+1) to undef
vecteur seqapp_compute(const gen & expr,const vecteur & vars,const gen & UK_k,const gen &UK_kp1,int k,int m,GIAC_CONTEXT);
// Prepares app sequence for computing all recurrences relations
// expr_un should contain the expression for U0(N) to UK(N) for K<=9
// undef may be used if the sequence is not checked
// Rewrite the recurrence relation as [U0(N),...,UK(N)]=subst(expr,vars,[N,U0(N-1),U0(N-2),...])
// Return 0 if expr_un is invalid, -10-val if Uval should be checked
// Return 1 if it does not depend on UK(N-2), 2 otherwise
int seqapp_prepare(const vecteur & expr_un,vecteur & expr,vecteur & vars,GIAC_CONTEXT);
// Compute UK(N) for K=k to m, where UK(k) and UK(k+1) are given
// If the recurrence relation does not depend on UK(N-2), set UK_kp1 to vecteur(0)
vecteur seqapp_compute(const vecteur & expr,const vecteur & vars,const vecteur & UK_k,const vecteur &UK_kp1,int k,int m,GIAC_CONTEXT);
// check if a lowercase commandname should be uppercased
// returns 0 if not, returns a statically pointer valid up to next call if so
char * hp38_display_in_maj(const char * s);
#ifndef NO_NAMESPACE_GIAC
} // namespace giac
#endif // ndef NO_NAMESPACE_GIAC
#endif // _GIAC_RPN_H