Definition at line 347 of file glue_declare.cpp.
| closure_routine_rep | ( | const evaluator & | e, |
| const vector< nat > & | s, | ||
| const generic & | a, | ||
| const generic & | b | ||
| ) | [inline] |
Definition at line 353 of file glue_declare.cpp.
:
routine_rep (GEN_CLOSURE), ev (e), sig (s), args (a), body (b) {}
| generic apply | ( | const vector< generic > & | v ) | const [inline] |
Definition at line 356 of file glue_declare.cpp.
References mmx::base_evaluator(), and mmx::convert_to().
{
nat i, n= N(args);
//mmout << "Trace] " << args[0];
//for (nat i=0; i<N(v); i++) mmout << ", " << v[i];
//mmout << "\n";
if (N(v) != n-1) {
mmerr << "Routine : " << args[0] << "\n";
mmerr << "Expected : " << cdr (compound_to_vector (args)) << "\n";
mmerr << "Arguments: " << v << "\n";
return wrong_nr_args (gen (args[0], v));
}
select_evaluator (base_evaluator (ev));
for (i=1; i<n; i++) {
if (sig[i] == 0) current_ev->set (args[i], v[i-1]);
else {
//mmout << "Convert " << v[i-1] << " to " << sig[i] << "\n";
generic r= convert_to (v[i-1], sig[i], args[i]);
if (is<exception> (r)) {
restore_evaluator ();
return trace_push (r, gen (args[0], v));
}
current_ev->set (args[i], r);
}
}
generic r= eval (body);
if (is<exception> (r)) {
generic msg= *as<exception> (r);
if (is_func (msg, GEN_RETURN, 1)) r= msg[1];
}
if (sig[0] != 0 && !is<exception> (r))
r= convert_to (r, sig[0], body);
restore_evaluator ();
if (is<exception> (r)) return trace_push (r, gen (args[0], v));
return r;
}
| generic function_body | ( | ) | const [inline] |
Definition at line 392 of file glue_declare.cpp.
{ return gen (GEN_MAPSTO, args, body); }
| vector<nat> signature | ( | ) | const [inline] |
Definition at line 391 of file glue_declare.cpp.
{ return sig; }
1.7.2