X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ffunction.pl;h=b72a62c1ca111f52bc125d26e2e894148958827c;hp=bc46d710ad3355dd4f4e4ee64e72d8ad6900513a;hb=af6809f55c95cf6ea6ef80bd1d19637a06f32e5a;hpb=dbd9c306a74f1cb258c0d15a346b973b39deaad2 diff --git a/ginac/function.pl b/ginac/function.pl index bc46d710..b72a62c1 100755 --- a/ginac/function.pl +++ b/ginac/function.pl @@ -504,7 +504,6 @@ function_options& function_options::series_func(series_funcp_exvector s) return *this; } - function_options & function_options::set_return_type(unsigned rt, unsigned rtt) { use_return_type = true; @@ -770,28 +769,31 @@ ex function::evalf(int level) const { GINAC_ASSERT(serialevalf(level)); - ++it; + --level; + exvector::const_iterator it = seq.begin(), itend = seq.end(); + while (it != itend) { + eseq.push_back(it->evalf(level)); + ++it; + } } - - if (registered_functions()[serial].evalf_f==0) { + + if (opt.evalf_f==0) { return function(serial,eseq).hold(); } current_serial = serial; - if (registered_functions()[serial].evalf_use_exvector_args) - return ((evalf_funcp_exvector)(registered_functions()[serial].evalf_f))(seq); - switch (registered_functions()[serial].nparams) { + if (opt.evalf_use_exvector_args) + return ((evalf_funcp_exvector)(opt.evalf_f))(seq); + switch (opt.nparams) { // the following lines have been generated for max. ${maxargs} parameters ${evalf_switch_statement} // end of generated lines @@ -913,18 +915,36 @@ bool function::match_same_type(const basic & other) const unsigned function::return_type(void) const { - if (seq.empty()) - return return_types::commutative; - else - return seq.begin()->return_type(); + const function_options &opt = registered_functions()[serial]; + + if (opt.use_return_type) { + // Return type was explicitly specified + return opt.return_type; + } else { + // Default behavior is to use the return type of the first + // argument. Thus, exp() of a matrix behaves like a matrix, etc. + if (seq.empty()) + return return_types::commutative; + else + return seq.begin()->return_type(); + } } unsigned function::return_type_tinfo(void) const { - if (seq.empty()) - return tinfo_key; - else - return seq.begin()->return_type_tinfo(); + const function_options &opt = registered_functions()[serial]; + + if (opt.use_return_type) { + // Return type was explicitly specified + return opt.return_type_tinfo; + } else { + // Default behavior is to use the return type of the first + // argument. Thus, exp() of a matrix behaves like a matrix, etc. + if (seq.empty()) + return tinfo_key; + else + return seq.begin()->return_type_tinfo(); + } } //////////