aboutsummaryrefslogtreecommitdiff
path: root/model.cpp
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-08 11:01:11 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-08 11:01:11 +0800
commitcff8072df5daba2c38ae2765af36cbb09da358f1 (patch)
tree31ea2b425342c2de43fa6d58125f9ea995948452 /model.cpp
parent56a85b5111751f5947579b5ee5cc92bdebb799c4 (diff)
`lambda` and `define` are fully supported now
Diffstat (limited to 'model.cpp')
-rw-r--r--model.cpp23
1 files changed, 12 insertions, 11 deletions
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<SymObj*> 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<SymObj*> 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<SymObj*>(ppar->car), args->car);
+ _envt->add_binding(static_cast<SymObj*>(TO_CONS(ppar)->car), args->car);
}
- if (args->cdr != empty_list || ppar != empty_list)
+ if (!ppar->is_cons_obj())
+ _envt->add_binding(static_cast<SymObj*>(ppar), args->cdr); // (... . var_n)
+ else if (args->cdr != empty_list || ppar != empty_list)
throw TokenError("", RUN_ERR_WRONG_NUM_OF_ARGS);
genvt = _envt;