From 645549b8a42844fc5a8042a4808c8ebf5050d7da Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 4 Aug 2013 23:35:59 +0800 Subject: added support for `cons`, `car`, `cdr` --- model.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'model.cpp') diff --git a/model.cpp b/model.cpp index 2132d1f..fab17d6 100644 --- a/model.cpp +++ b/model.cpp @@ -35,6 +35,10 @@ bool EvalObj::is_opt_obj() { return otype & CLS_OPT_OBJ; } +bool EvalObj::is_cons_obj() { + return otype & CLS_CONS_OBJ; +} + #ifdef DEBUG void EvalObj::_debug_print() { printf("mem: 0x%llX\n%s\n\n", (unsigned long long)this, @@ -46,11 +50,13 @@ bool EvalObj::is_true() { return true; } -Cons::Cons(EvalObj *_car, Cons *_cdr) : +Cons::Cons(EvalObj *_car, EvalObj *_cdr) : EvalObj(CLS_CONS_OBJ), car(_car), cdr(_cdr), skip(false), - next(cdr == empty_list ? NULL : cdr) {} + next(NULL) {} -string Cons::ext_repr() { return string("#"); } +string Cons::ext_repr() { + return "(" + car->ext_repr() + " . " + cdr->ext_repr() + ")"; +} #ifdef DEBUG string Cons::_debug_repr() { return ext_repr(); } @@ -106,9 +112,9 @@ Cons *ProcObj::call(ArgList *args, Environment * &genvt, Environment *_envt = new Environment(envt); // static_cast because the para_list is already checked Cons *ptr, *ppar; - for (ptr = args->cdr, ppar = para_list; + for (ptr = TO_CONS(args->cdr), ppar = para_list; ptr != empty_list && ppar != empty_list; - ptr = ptr->cdr, ppar = ppar->cdr) + ptr = TO_CONS(ptr->cdr), ppar = TO_CONS(ppar->cdr)) _envt->add_binding(static_cast(ppar->car), ptr->car); if (ptr != empty_list || ppar != empty_list) @@ -137,7 +143,7 @@ Cons *BuiltinProcObj::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { Cons *ret_addr = static_cast(*top_ptr)->addr; - *top_ptr++ = handler(args->cdr); + *top_ptr++ = handler(TO_CONS(args->cdr)); return ret_addr->next; // Move to the next instruction } -- cgit v1.2.3