Definition at line 355 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 361 of file glue_declare.cpp.
00362 : 00363 routine_rep (GEN_CLOSURE), ev (e), sig (s), args (a), body (b) {} generic apply (const vector<generic>& v) const {
Reimplemented from routine_rep.
Definition at line 364 of file glue_declare.cpp.
References mmx::cdr(), mmx::compound_to_vector(), mmx::current_ev, mmx::eval(), mmx::gen(), mmx::GEN_RETURN, mmx::is_func(), mmx::mmerr, mmx::N(), n, mmx::restore_evaluator(), mmx::select_evaluator(), mmx::trace_push(), and mmx::wrong_nr_args().
00364 { 00365 nat i, n= N(args); 00366 //mmout << "Trace] " << args[0]; 00367 //for (nat i=0; i<N(v); i++) mmout << ", " << v[i]; 00368 //mmout << "\n"; 00369 if (N(v) != n-1) { 00370 mmerr << "Routine : " << args[0] << "\n"; 00371 mmerr << "Expected : " << cdr (compound_to_vector (args)) << "\n"; 00372 mmerr << "Arguments: " << v << "\n"; 00373 return wrong_nr_args (gen (args[0], v)); 00374 } 00375 select_evaluator (base_evaluator (ev)); 00376 for (i=1; i<n; i++) { 00377 if (sig[i] == 0) current_ev->set (args[i], v[i-1]); 00378 else { 00379 //mmout << "Convert " << v[i-1] << " to " << sig[i] << "\n"; 00380 generic r= convert_to (v[i-1], sig[i], args[i]); 00381 if (is<exception> (r)) { 00382 restore_evaluator (); 00383 return trace_push (r, gen (args[0], v)); 00384 } 00385 current_ev->set (args[i], r); 00386 } 00387 } 00388 generic r= eval (body); 00389 if (is<exception> (r)) { 00390 generic msg= *as<exception> (r); 00391 if (is_func (msg, GEN_RETURN, 1)) r= msg[1]; 00392 } 00393 if (sig[0] != 0 && !is<exception> (r)) 00394 r= convert_to (r, sig[0], body); 00395 restore_evaluator (); 00396 if (is<exception> (r)) return trace_push (r, gen (args[0], v)); 00397 return r; 00398 }
generic function_body | ( | ) | const [inline, virtual] |
Reimplemented from routine_rep.
Definition at line 400 of file glue_declare.cpp.
References mmx::gen(), and mmx::GEN_MAPSTO.
00400 { return gen (GEN_MAPSTO, args, body); }
Reimplemented from routine_rep.
Definition at line 399 of file glue_declare.cpp.