def max_to_sr(expr): r""" Convert a Maxima object into a symbolic expression. INPUT: - ``expr`` - ECL object OUTPUT: symbolic expression EXAMPLES:: sage: from sage.interfaces.maxima_lib import maxima_lib, max_to_sr sage: f = maxima_lib('f(x)') sage: f.ecl() <ECL: (($F SIMP) $X)> sage: max_to_sr(f.ecl()) f(x) TESTS:: sage: from sage.interfaces.maxima_lib import sr_to_max, max_to_sr sage: f = function('f',x).diff() sage: bool(max_to_sr(sr_to_max(f)) == f) True """ if expr.consp(): op_max=caar(expr) if op_max in special_max_to_sage: return special_max_to_sage[op_max](expr) if not(op_max in max_op_dict): # This could be unsafe if the conversion to SR # changes the structure of expr sage_expr=SR(maxima(expr)) max_op_dict[op_max]=sage_expr.operator() sage_op_dict[sage_expr.operator()]=op_max op=max_op_dict[op_max] max_args=cdr(expr) args=[max_to_sr(a) for a in max_args] return op(*args) elif expr.symbolp(): if not(expr in max_sym_dict): sage_symbol=SR(maxima(expr)) sage_sym_dict[sage_symbol]=expr max_sym_dict[expr]=sage_symbol return max_sym_dict[expr] else: e=expr.python() if isinstance(e,float): return sage.rings.real_double.RealDoubleElement(e) return e