C++ already have associative arrays, there's no need to re-invent them.
.BI transpose( matrix )
\- transpose of a matrix
.br
.BI transpose( matrix )
\- transpose of a matrix
.br
-.BI unassign( symbol )
-\- unassign an assigned symbol
+.BI unassign( 'symbol' )
+\- unassign an assigned symbol (mind the quotes, please!)
.br
.BI unit( expression ", " symbol )
\- unit part of a polynomial
.br
.BI unit( expression ", " symbol )
\- unit part of a polynomial
// Expression stack for %, %% and %%%
static void push(const ex &e);
static ex exstack[3];
// Expression stack for %, %% and %%%
static void push(const ex &e);
static ex exstack[3];
+// Assigned symbols
+static exmap assigned_symbol_table;
// Start and end time for the time() function
#ifdef HAVE_RUSAGE
// Start and end time for the time() function
#ifdef HAVE_RUSAGE
;
exp : T_NUMBER {$$ = $1;}
;
exp : T_NUMBER {$$ = $1;}
- | T_SYMBOL {$$ = $1.eval();}
+ | T_SYMBOL {
+ exmap::const_iterator i = assigned_symbol_table.find($1);
+ if (i == assigned_symbol_table.end())
+ $$ = $1;
+ else
+ $$ = i->second.eval();
+ }
| '\'' T_SYMBOL '\'' {$$ = $2;}
| T_LITERAL {$$ = $1;}
| T_DIGITS {$$ = $1;}
| '\'' T_SYMBOL '\'' {$$ = $2;}
| T_LITERAL {$$ = $1;}
| T_DIGITS {$$ = $1;}
}
}
| T_DIGITS '=' T_NUMBER {$$ = $3; Digits = ex_to<numeric>($3).to_int();}
}
}
| T_DIGITS '=' T_NUMBER {$$ = $3; Digits = ex_to<numeric>($3).to_int();}
- | T_SYMBOL '=' exp {$$ = $3; const_cast<symbol&>(ex_to<symbol>($1)).assign($3);}
+ | T_SYMBOL '=' exp {$$ = $3; assigned_symbol_table[$1] = $3; }
| exp T_EQUAL exp {$$ = $1 == $3;}
| exp T_NOTEQ exp {$$ = $1 != $3;}
| exp '<' exp {$$ = $1 < $3;}
| exp T_EQUAL exp {$$ = $1 == $3;}
| exp T_NOTEQ exp {$$ = $1 != $3;}
| exp '<' exp {$$ = $1 < $3;}
static ex f_unassign(const exprseq &e)
{
CHECK_ARG(0, symbol, unassign);
static ex f_unassign(const exprseq &e)
{
CHECK_ARG(0, symbol, unassign);
- const_cast<symbol&>(ex_to<symbol>(e[0])).unassign();
+ exmap::iterator i = assigned_symbol_table.find(e[0]);
+ if (i != assigned_symbol_table.end())
+ assigned_symbol_table.erase(i);
// Print banner in interactive mode
if (isatty(0))
greeting();
// Print banner in interactive mode
if (isatty(0))
greeting();
+ assigned_symbol_table = exmap();
// Init function table
insert_fcns(builtin_fcns);
// Init function table
insert_fcns(builtin_fcns);