From cff8072df5daba2c38ae2765af36cbb09da358f1 Mon Sep 17 00:00:00 2001 From: Teddy Date: Thu, 8 Aug 2013 11:01:11 +0800 Subject: `lambda` and `define` are fully supported now --- model.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'model.cpp') diff --git a/model.cpp b/model.cpp index 89849ca..8ffc019 100644 --- a/model.cpp +++ b/model.cpp @@ -133,8 +133,8 @@ OptObj::OptObj() : EvalObj(CLS_SIM_OBJ | CLS_OPT_OBJ) {} ProcObj::ProcObj(ASTList *_body, Environment *_envt, - SymbolList *_para_list) : - OptObj(), body(_body), envt(_envt), para_list(_para_list) {} + EvalObj *_params) : + OptObj(), body(_body), envt(_envt), params(_params) {} Cons *ProcObj::call(ArgList *args, Environment * &genvt, Continuation * &cont, FrameObj ** &top_ptr) { @@ -144,20 +144,21 @@ Cons *ProcObj::call(ArgList *args, Environment * &genvt, Continuation *_cont = new Continuation(genvt, ret_addr, cont, body); // Create local env and recall the closure Environment *_envt = new Environment(envt); - // static_cast because the para_list is already checked - Cons *ppar; - EvalObj *nptr; - for (ppar = para_list; - ppar != empty_list; - ppar = TO_CONS(ppar->cdr)) + // static_cast because the params is already checked + EvalObj *ppar, *nptr; + for (ppar = params; + ppar->is_cons_obj(); + ppar = TO_CONS(ppar)->cdr) { - if ((nptr = args->cdr)->is_cons_obj()) + if ((nptr = args->cdr) != empty_list) args = TO_CONS(nptr); else break; - _envt->add_binding(static_cast(ppar->car), args->car); + _envt->add_binding(static_cast(TO_CONS(ppar)->car), args->car); } - if (args->cdr != empty_list || ppar != empty_list) + if (!ppar->is_cons_obj()) + _envt->add_binding(static_cast(ppar), args->cdr); // (... . var_n) + else if (args->cdr != empty_list || ppar != empty_list) throw TokenError("", RUN_ERR_WRONG_NUM_OF_ARGS); genvt = _envt; -- cgit v1.2.3