basic * duplicate() const;
void print(const print_context & c, unsigned level = 0) const;
bool info(unsigned inf) const;
- ex expand(unsigned options = 0) const;
- bool has(const ex & other) const;
int degree(const ex & s) const;
int ldegree(const ex & s) const;
ex coeff(const ex & s, int n = 1) const;
ex eval(int level = 0) const;
+ ex evalf(int level = 0) const { return *this; } // overwrites basic::evalf() for performance reasons
ex series(const relational & s, int order, unsigned options = 0) const;
ex normal(lst &sym_lst, lst &repl_lst, int level = 0) const;
ex to_rational(lst &repl_lst) const;
// utility functions
+
+/** Return the symbol object handled by an ex. Deprecated: use ex_to<symbol>().
+ * This is unsafe: you need to check the type first. */
inline const symbol &ex_to_symbol(const ex &e)
{
return static_cast<const symbol &>(*e.bp);
}
+inline symbol &ex_to_nonconst_symbol(const ex &e)
+{
+ return static_cast<symbol &>(*e.bp);
+}
+
+/** Specialization of is_exactly_a<symbol>(obj) for symbol objects. */
+template<> inline bool is_exactly_a<symbol>(const basic & obj)
+{
+ return obj.tinfo()==TINFO_symbol;
+}
// wrapper functions around member functions
inline void unassign(symbol & symarg)