diff options
author | Teddy <ted.sybil@gmail.com> | 2013-08-08 18:27:03 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2013-08-08 18:27:03 +0800 |
commit | 2c9f05a38ef64cbaeeae6429cd0e245c27944660 (patch) | |
tree | 446e29a0a6811ac548b2d08d59385bb062f047cc | |
parent | de0ab402f28a9e5ed4ef443df336f856bb521c83 (diff) |
rectified some names
-rw-r--r-- | builtin.cpp | 200 | ||||
-rw-r--r-- | builtin.h | 30 | ||||
-rw-r--r-- | eval.cpp | 24 | ||||
-rw-r--r-- | eval.h | 2 | ||||
-rw-r--r-- | main.cpp | 12 | ||||
-rw-r--r-- | model.cpp | 116 | ||||
-rw-r--r-- | model.h | 98 | ||||
-rw-r--r-- | parser.cpp | 20 | ||||
-rw-r--r-- | parser.h | 4 |
9 files changed, 196 insertions, 310 deletions
diff --git a/builtin.cpp b/builtin.cpp index 491d1ae..6579e98 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -19,7 +19,7 @@ static const int NUM_LVL_INT = 3; #define ARGS_EXACTLY_TWO \ if (args == empty_list || \ args->cdr == empty_list || \ - TO_CONS(args->cdr)->cdr != empty_list) \ + TO_PAIR(args->cdr)->cdr != empty_list) \ throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS) #define ARGS_EXACTLY_ONE \ @@ -31,12 +31,12 @@ static const int NUM_LVL_INT = 3; if (args == empty_list) \ throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS) -bool is_list(Cons *ptr) { +bool is_list(Pair *ptr) { if (ptr == empty_list) return true; EvalObj *nptr; for (;;) if ((nptr = ptr->cdr)->is_cons_obj()) - ptr = TO_CONS(nptr); + ptr = TO_PAIR(nptr); else break; return ptr->cdr == empty_list; } @@ -539,13 +539,13 @@ string IntNumObj::ext_repr() { SpecialOptIf::SpecialOptIf() : SpecialOptObj("if") {} -void SpecialOptIf::prepare(Cons *pc) { +void SpecialOptIf::prepare(Pair *pc) { #define IF_EXP_ERR \ throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS) state = 0; // Prepared if (pc->cdr->is_cons_obj()) - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); else IF_EXP_ERR; // if (pc == empty_list) @@ -554,7 +554,7 @@ void SpecialOptIf::prepare(Cons *pc) { pc->skip = false; if (pc->cdr->is_cons_obj()) - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); else IF_EXP_ERR; // if (pc == empty_list) @@ -565,8 +565,8 @@ void SpecialOptIf::prepare(Cons *pc) { { if (pc->cdr->is_cons_obj()) { - TO_CONS(pc->cdr)->skip = true; - if (TO_CONS(pc->cdr)->cdr != empty_list) + TO_PAIR(pc->cdr)->skip = true; + if (TO_PAIR(pc->cdr)->cdr != empty_list) IF_EXP_ERR; } else @@ -574,41 +574,41 @@ void SpecialOptIf::prepare(Cons *pc) { } } -void SpecialOptIf::pre_call(ArgList *args, Cons *pc, +void SpecialOptIf::pre_call(ArgList *args, Pair *pc, Environment *envt) { // static_cast because it's a call invocation - pc = TO_CONS(TO_CONS(pc->car)->cdr); + pc = TO_PAIR(TO_PAIR(pc->car)->cdr); // Condition evaluated and the decision is made state = 1; - if (TO_CONS(args->cdr)->car->is_true()) + if (TO_PAIR(args->cdr)->car->is_true()) { pc->skip = true; - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); pc->skip = false; if (pc->cdr != empty_list) - TO_CONS(pc->cdr)->skip = true; // Eval the former + TO_PAIR(pc->cdr)->skip = true; // Eval the former } else { pc->skip = true; - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); pc->skip = true; if (pc->cdr != empty_list) - TO_CONS(pc->cdr)->skip = false; //Eval the latter + TO_PAIR(pc->cdr)->skip = false; //Eval the latter } } -EvalObj *SpecialOptIf::post_call(ArgList *args, Cons *pc, +EvalObj *SpecialOptIf::post_call(ArgList *args, Pair *pc, Environment *envt) { // Value already evaluated, so just return it - return TO_CONS(args->cdr)->car; + return TO_PAIR(args->cdr)->car; } -Cons *SpecialOptIf::call(ArgList *args, Environment * &envt, +Pair *SpecialOptIf::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; if (state) { *top_ptr++ = post_call(args, ret_addr, envt); @@ -620,7 +620,7 @@ Cons *SpecialOptIf::call(ArgList *args, Environment * &envt, top_ptr += 2; // Undo pop and invoke again // static_cast because it's a call invocation - return TO_CONS(ret_addr->car)->next; + return TO_PAIR(ret_addr->car)->next; } } @@ -631,11 +631,11 @@ SpecialOptLambda::SpecialOptLambda() : SpecialOptObj("lambda") {} do \ { \ EvalObj *nptr; \ - Cons *ptr; \ + Pair *ptr; \ for (ptr = pc;;) \ { \ if ((nptr = ptr->cdr)->is_cons_obj()) \ - ptr = TO_CONS(nptr); \ + ptr = TO_PAIR(nptr); \ else break; \ ptr->skip = flag; \ } \ @@ -656,11 +656,11 @@ do \ { \ if (p == empty_list) break; \ EvalObj *nptr; \ - Cons *ptr; \ - for (ptr = TO_CONS(p);;) \ + Pair *ptr; \ + for (ptr = TO_PAIR(p);;) \ { \ if ((nptr = ptr->cdr)->is_cons_obj()) \ - ptr = TO_CONS(nptr); \ + ptr = TO_PAIR(nptr); \ else break; \ CHECK_SYMBOL(ptr->car); \ } \ @@ -670,26 +670,26 @@ do \ while (0) -void SpecialOptLambda::prepare(Cons *pc) { +void SpecialOptLambda::prepare(Pair *pc) { // Do not evaluate anything FILL_MARKS(pc, true); } -Cons *SpecialOptLambda::call(ArgList *args, Environment * &envt, +Pair *SpecialOptLambda::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; - Cons *pc = static_cast<Cons*>(ret_addr->car); + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *pc = static_cast<Pair*>(ret_addr->car); // TODO: remove the following two lines? if (pc->cdr == empty_list) throw TokenError(name, SYN_ERR_EMPTY_PARA_LIST); - if (TO_CONS(pc->cdr)->cdr == empty_list) + if (TO_PAIR(pc->cdr)->cdr == empty_list) throw TokenError(name, SYN_ERR_MISS_OR_EXTRA_EXP); // Clear the flag to avoid side-effects (e.g. proc calling) FILL_MARKS(pc, false); - pc = TO_CONS(pc->cdr); // Now pointintg to params + pc = TO_PAIR(pc->cdr); // Now pointintg to params if (pc->car->is_simple_obj()) CHECK_SYMBOL(pc->car); else @@ -698,8 +698,8 @@ Cons *SpecialOptLambda::call(ArgList *args, Environment * &envt, // store a list of expressions inside <body> - ASTList *body = TO_CONS(pc->cdr); // Truncate the expression list - for (Cons *ptr = body; ptr != empty_list; ptr = TO_CONS(ptr->cdr)) + Pair *body = TO_PAIR(pc->cdr); // Truncate the expression list + for (Pair *ptr = body; ptr != empty_list; ptr = TO_PAIR(ptr->cdr)) ptr->next = NULL; // Make each expression an orphan *top_ptr++ = new ProcObj(body, envt, params); @@ -710,40 +710,40 @@ string SpecialOptLambda::ext_repr() { return string("#<Builtin Macro: lambda>"); SpecialOptDefine::SpecialOptDefine() : SpecialOptObj("define") {} -void SpecialOptDefine::prepare(Cons *pc) { +void SpecialOptDefine::prepare(Pair *pc) { if (!pc->cdr->is_cons_obj()) throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS); - if (TO_CONS(pc->cdr)->car->is_simple_obj()) // Simple value assignment + if (TO_PAIR(pc->cdr)->car->is_simple_obj()) // Simple value assignment { - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); if (!pc->cdr->is_cons_obj()) throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS); pc->skip = true; // Skip the identifier - TO_CONS(pc->cdr)->skip = false; + TO_PAIR(pc->cdr)->skip = false; } // Procedure definition else FILL_MARKS(pc, true); // Skip all parts } -Cons *SpecialOptDefine::call(ArgList *args, Environment * &envt, +Pair *SpecialOptDefine::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; - Cons *pc = static_cast<Cons*>(ret_addr->car); + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *pc = static_cast<Pair*>(ret_addr->car); EvalObj *obj; SymObj *id; - EvalObj *first = TO_CONS(pc->cdr)->car; + EvalObj *first = TO_PAIR(pc->cdr)->car; if (first->is_simple_obj()) { if (!first->is_sym_obj()) throw TokenError(first->ext_repr(), SYN_ERR_NOT_AN_ID); ARGS_EXACTLY_TWO; id = static_cast<SymObj*>(first); - obj = TO_CONS(args->cdr)->car; + obj = TO_PAIR(args->cdr)->car; } else { // static_cast because of is_simple_obj() is false - Cons *plst = static_cast<Cons*>(first); + Pair *plst = static_cast<Pair*>(first); if (plst == empty_list) throw TokenError(name, SYN_ERR_EMPTY_PARA_LIST); @@ -758,12 +758,12 @@ Cons *SpecialOptDefine::call(ArgList *args, Environment * &envt, // Clear the flag to avoid side-effects (e.g. proc calling) FILL_MARKS(pc, false); - ASTList *body = TO_CONS(TO_CONS(pc->cdr)->cdr); // Truncate the expression list + Pair *body = TO_PAIR(TO_PAIR(pc->cdr)->cdr); // Truncate the expression list if (body == empty_list) throw TokenError(name, SYN_ERR_MISS_OR_EXTRA_EXP); - for (Cons *ptr = body; ptr != empty_list; ptr = TO_CONS(ptr->cdr)) + for (Pair *ptr = body; ptr != empty_list; ptr = TO_PAIR(ptr->cdr)) ptr->next = NULL; // Make each expression a orphan obj = new ProcObj(body, envt, params); @@ -775,27 +775,27 @@ Cons *SpecialOptDefine::call(ArgList *args, Environment * &envt, string SpecialOptDefine::ext_repr() { return string("#<Builtin Macro: define>"); } -void SpecialOptSet::prepare(Cons *pc) { +void SpecialOptSet::prepare(Pair *pc) { if (!pc->cdr->is_cons_obj()) throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS); - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); pc->skip = true; // Skip the identifier if (!pc->cdr->is_cons_obj()) throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS); - pc = TO_CONS(pc->cdr); + pc = TO_PAIR(pc->cdr); pc->skip = false; } -Cons *SpecialOptSet::call(ArgList *args, Environment * &envt, +Pair *SpecialOptSet::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; - Cons *pc = static_cast<Cons*>(ret_addr->car); - EvalObj *first = TO_CONS(pc->cdr)->car; + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *pc = static_cast<Pair*>(ret_addr->car); + EvalObj *first = TO_PAIR(pc->cdr)->car; if (!first->is_sym_obj()) throw TokenError(first->ext_repr(), SYN_ERR_NOT_AN_ID); @@ -803,7 +803,7 @@ Cons *SpecialOptSet::call(ArgList *args, Environment * &envt, SymObj *id = static_cast<SymObj*>(first); - bool flag = envt->add_binding(id, TO_CONS(args->cdr)->car, false); + bool flag = envt->add_binding(id, TO_PAIR(args->cdr)->car, false); if (!flag) throw TokenError(id->ext_repr(), RUN_ERR_UNBOUND_VAR); *top_ptr++ = new UnspecObj(); return ret_addr->next; @@ -815,18 +815,18 @@ string SpecialOptSet::ext_repr() { return string("#<Builtin Macro: set!>"); } SpecialOptQuote::SpecialOptQuote() : SpecialOptObj("quote") {} -void SpecialOptQuote::prepare(Cons *pc) { +void SpecialOptQuote::prepare(Pair *pc) { // Do not evaluate anything FILL_MARKS(pc, true); } -Cons *SpecialOptQuote::call(ArgList *args, Environment * &envt, +Pair *SpecialOptQuote::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; - Cons *pc = static_cast<Cons*>(ret_addr->car); + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *pc = static_cast<Pair*>(ret_addr->car); // revert FILL_MARKS(pc, false); - *top_ptr++ = TO_CONS(pc->cdr)->car; + *top_ptr++ = TO_PAIR(pc->cdr)->car; return ret_addr->next; } @@ -834,27 +834,27 @@ string SpecialOptQuote::ext_repr() { return string("#<Builtin Macro: quote>"); } SpecialOptEval::SpecialOptEval() : SpecialOptObj("eval") {} -void SpecialOptEval::prepare(Cons *pc) { +void SpecialOptEval::prepare(Pair *pc) { state = 0; } -Cons *SpecialOptEval::call(ArgList *args, Environment * &envt, +Pair *SpecialOptEval::call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr) { if (args->cdr == empty_list || - TO_CONS(args->cdr)->cdr != empty_list) + TO_PAIR(args->cdr)->cdr != empty_list) throw TokenError(name, RUN_ERR_WRONG_NUM_OF_ARGS); - Cons *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; - Cons *pc = static_cast<Cons*>(ret_addr->car); + Pair *ret_addr = static_cast<RetAddr*>(*top_ptr)->addr; + Pair *pc = static_cast<Pair*>(ret_addr->car); if (state) { - *top_ptr++ = TO_CONS(args->cdr)->car; + *top_ptr++ = TO_PAIR(args->cdr)->car; return ret_addr->next; // Move to the next instruction } else { state = 1; top_ptr += 2; - return TO_CONS(args->cdr); + return TO_PAIR(args->cdr); } } @@ -862,7 +862,7 @@ string SpecialOptEval::ext_repr() { return string("#<Builtin Macro: eval>"); } BUILTIN_PROC_DEF(make_pair) { ARGS_EXACTLY_TWO; - return new Cons(args->car, TO_CONS(args->cdr)->car); + return new Pair(args->car, TO_PAIR(args->cdr)->car); } BUILTIN_PROC_DEF(pair_car) { @@ -870,7 +870,7 @@ BUILTIN_PROC_DEF(pair_car) { if (!args->car->is_cons_obj()) throw TokenError("pair", RUN_ERR_WRONG_TYPE); - return TO_CONS(args->car)->car; + return TO_PAIR(args->car)->car; } BUILTIN_PROC_DEF(pair_cdr) { @@ -878,7 +878,7 @@ BUILTIN_PROC_DEF(pair_cdr) { if (!args->car->is_cons_obj()) throw TokenError("pair", RUN_ERR_WRONG_TYPE); - return TO_CONS(args->car)->cdr; + return TO_PAIR(args->car)->cdr; } BUILTIN_PROC_DEF(make_list) { @@ -890,7 +890,7 @@ BUILTIN_PROC_DEF(make_list) { BUILTIN_PROC_DEF(num_add) { ARGS_AT_LEAST_ONE; NumObj *res = new IntNumObj(0), *opr; // the most accurate type - for (;args != empty_list; args = TO_CONS(args->cdr)) + for (;args != empty_list; args = TO_PAIR(args->cdr)) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -911,8 +911,8 @@ BUILTIN_PROC_DEF(num_sub) { throw TokenError("a number", RUN_ERR_WRONG_TYPE); NumObj *res = static_cast<NumObj*>(args->car), *opr; - args = TO_CONS(args->cdr); - for (; args != empty_list; args = TO_CONS(args->cdr)) + args = TO_PAIR(args->cdr); + for (; args != empty_list; args = TO_PAIR(args->cdr)) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -932,7 +932,7 @@ BUILTIN_PROC_DEF(num_sub) { BUILTIN_PROC_DEF(num_mul) { ARGS_AT_LEAST_ONE; NumObj *res = new IntNumObj(1), *opr; // the most accurate type - for (;args != empty_list; args = TO_CONS(args->cdr)) + for (;args != empty_list; args = TO_PAIR(args->cdr)) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -953,8 +953,8 @@ BUILTIN_PROC_DEF(num_div) { throw TokenError("a number", RUN_ERR_WRONG_TYPE); NumObj *res = static_cast<NumObj*>(args->car), *opr; - args = TO_CONS(args->cdr); - for (; args != empty_list; args = TO_CONS(args->cdr)) + args = TO_PAIR(args->cdr); + for (; args != empty_list; args = TO_PAIR(args->cdr)) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -978,7 +978,7 @@ BUILTIN_PROC_DEF(num_lt) { throw TokenError("a number", RUN_ERR_WRONG_TYPE); NumObj *last = static_cast<NumObj*>(args->car), *opr; - for (; args != empty_list; args = TO_CONS(args->cdr), last = opr) + for (; args != empty_list; args = TO_PAIR(args->cdr), last = opr) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -1002,7 +1002,7 @@ BUILTIN_PROC_DEF(num_gt) { throw TokenError("a number", RUN_ERR_WRONG_TYPE); NumObj *last = static_cast<NumObj*>(args->car), *opr; - for (; args != empty_list; args = TO_CONS(args->cdr), last = opr) + for (; args != empty_list; args = TO_PAIR(args->cdr), last = opr) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -1026,7 +1026,7 @@ BUILTIN_PROC_DEF(num_eq) { throw TokenError("a number", RUN_ERR_WRONG_TYPE); NumObj *last = static_cast<NumObj*>(args->car), *opr; - for (; args != empty_list; args = TO_CONS(args->cdr), last = opr) + for (; args != empty_list; args = TO_PAIR(args->cdr), last = opr) { if (!args->car->is_num_obj()) // not a number throw TokenError("a number", RUN_ERR_WRONG_TYPE); @@ -1061,7 +1061,7 @@ BUILTIN_PROC_DEF(pair_set_car) { ARGS_EXACTLY_TWO; if (!args->car->is_cons_obj()) throw TokenError("pair", RUN_ERR_WRONG_TYPE); - TO_CONS(args->car)->car = TO_CONS(args->cdr)->car; + TO_PAIR(args->car)->car = TO_PAIR(args->cdr)->car; return new UnspecObj(); } @@ -1069,7 +1069,7 @@ BUILTIN_PROC_DEF(pair_set_cdr) { ARGS_EXACTLY_TWO; if (!args->car->is_cons_obj()) throw TokenError("pair", RUN_ERR_WRONG_TYPE); - TO_CONS(args->car)->cdr = TO_CONS(args->cdr)->car; + TO_PAIR(args->car)->cdr = TO_PAIR(args->cdr)->car; return new UnspecObj(); } @@ -1084,12 +1084,12 @@ BUILTIN_PROC_DEF(is_list) { return new BoolObj(true); if (!args->car->is_cons_obj()) return new BoolObj(false); - args = TO_CONS(args->car); + args = TO_PAIR(args->car); EvalObj *nptr; for (;;) { if ((nptr = args->cdr)->is_cons_obj()) - args = TO_CONS(nptr); + args = TO_PAIR(nptr); else break; } return new BoolObj(args->cdr == empty_list); @@ -1117,11 +1117,11 @@ BUILTIN_PROC_DEF(length) { throw TokenError("a list", RUN_ERR_WRONG_TYPE); int num = 0; EvalObj *nptr; - for (args = TO_CONS(args->car);;) + for (args = TO_PAIR(args->car);;) { num++; if ((nptr = args->cdr)->is_cons_obj()) - args = TO_CONS(nptr); + args = TO_PAIR(nptr); else break; } @@ -1130,43 +1130,43 @@ BUILTIN_PROC_DEF(length) { return new IntNumObj(mpz_class(num)); } -Cons *copy_list(Cons *src, EvalObj * &tail) { +Pair *copy_list(Pair *src, EvalObj * &tail) { if (src == empty_list) throw NormalError(INT_ERR); EvalObj* nptr; - Cons head(NULL, NULL); + Pair head(NULL, NULL); tail = &head; for (;;) { - TO_CONS(tail)->cdr = new Cons(*src); - tail = TO_CONS(TO_CONS(tail)->cdr); + TO_PAIR(tail)->cdr = new Pair(*src); + tail = TO_PAIR(TO_PAIR(tail)->cdr); if ((nptr = src->cdr)->is_cons_obj()) - src = TO_CONS(nptr); + src = TO_PAIR(nptr); else break; } - return TO_CONS(head.cdr); + return TO_PAIR(head.cdr); } BUILTIN_PROC_DEF(append) { EvalObj *tail = empty_list, *head = tail; - for (; args != empty_list; args = TO_CONS(args->cdr)) + for (; args != empty_list; args = TO_PAIR(args->cdr)) { if (tail == empty_list) { head = args->car; if (head->is_cons_obj()) - head = copy_list(TO_CONS(head), tail); + head = copy_list(TO_PAIR(head), tail); else tail = head; } else { if (tail->is_cons_obj()) { - Cons *prev = TO_CONS(tail); + Pair *prev = TO_PAIR(tail); if (prev->cdr != empty_list) throw TokenError("empty list", RUN_ERR_WRONG_TYPE); if (args->car->is_cons_obj()) - prev->cdr = copy_list(TO_CONS(args->car), tail); + prev->cdr = copy_list(TO_PAIR(args->car), tail); else prev->cdr = args->car; } @@ -1179,11 +1179,11 @@ BUILTIN_PROC_DEF(append) { BUILTIN_PROC_DEF(reverse) { ARGS_EXACTLY_ONE; - Cons *tail = empty_list; + Pair *tail = empty_list; EvalObj *ptr; for (ptr = args->car; - ptr->is_cons_obj(); ptr = TO_CONS(ptr)->cdr) - tail = new Cons(TO_CONS(ptr)->car, tail); + ptr->is_cons_obj(); ptr = TO_PAIR(ptr)->cdr) + tail = new Pair(TO_PAIR(ptr)->car, tail); if (ptr != empty_list) throw TokenError("a list", RUN_ERR_WRONG_TYPE); return tail; @@ -1191,7 +1191,7 @@ BUILTIN_PROC_DEF(reverse) { BUILTIN_PROC_DEF(list_tail) { ARGS_EXACTLY_TWO; - EvalObj *sec = TO_CONS(args->cdr)->car; + EvalObj *sec = TO_PAIR(args->cdr)->car; if (!sec->is_num_obj() || static_cast<NumObj*>(sec)->level != NUM_LVL_INT) throw TokenError("an exact integer", RUN_ERR_WRONG_TYPE); @@ -1200,13 +1200,13 @@ BUILTIN_PROC_DEF(list_tail) { throw TokenError("a non-negative integer", RUN_ERR_WRONG_TYPE); EvalObj *ptr; for (i = 0, ptr = args->car; - ptr->is_cons_obj(); ptr = TO_CONS(ptr)->cdr, i++) + ptr->is_cons_obj(); ptr = TO_PAIR(ptr)->cdr, i++) if (i == k) break; if (i != k) throw TokenError("a pair", RUN_ERR_WRONG_TYPE); EvalObj *tail; if (ptr->is_cons_obj()) - return copy_list(TO_CONS(ptr), tail); + return copy_list(TO_PAIR(ptr), tail); else return ptr; } @@ -1214,7 +1214,7 @@ BUILTIN_PROC_DEF(list_tail) { BUILTIN_PROC_DEF(is_eqv) { ARGS_EXACTLY_TWO; EvalObj *obj1 = args->car; - EvalObj *obj2 = TO_CONS(args->cdr)->car; + EvalObj *obj2 = TO_PAIR(args->cdr)->car; ClassType otype = obj1->get_otype(); if (otype != obj2->get_otype()) return new BoolObj(false); @@ -7,7 +7,7 @@ using std::string; -bool is_list(Cons *ptr); +bool is_list(Pair *ptr); /** @class InexactNumObj * Inexact number implementation (using doubles) @@ -152,18 +152,18 @@ class SpecialOptIf: public SpecialOptObj { * The evaluator will call this after the <condition> exp is evaluated. * And this function tells the evaluator which of <consequence> and * <alternative> should be evaluted. */ - void pre_call(ArgList *args, Cons *pc, + void pre_call(ArgList *args, Pair *pc, Environment *envt); /** The system will call this again after the desired result is * evaluated, so just return it to let the evaluator know the it's the * answer. */ - EvalObj *post_call(ArgList *args, Cons *pc, + EvalObj *post_call(ArgList *args, Pair *pc, Environment *envt); public: SpecialOptIf(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); }; @@ -174,8 +174,8 @@ class SpecialOptIf: public SpecialOptObj { class SpecialOptLambda: public SpecialOptObj { public: SpecialOptLambda(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); @@ -187,8 +187,8 @@ class SpecialOptLambda: public SpecialOptObj { class SpecialOptDefine: public SpecialOptObj { public: SpecialOptDefine(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); }; @@ -199,8 +199,8 @@ class SpecialOptDefine: public SpecialOptObj { class SpecialOptSet: public SpecialOptObj { public: SpecialOptSet(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); }; @@ -211,8 +211,8 @@ class SpecialOptSet: public SpecialOptObj { class SpecialOptQuote: public SpecialOptObj { public: SpecialOptQuote(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); @@ -226,8 +226,8 @@ class SpecialOptEval: public SpecialOptObj { unsigned char state; /**< 0 for prepared, 1 for pre_called */ public: SpecialOptEval(); - void prepare(Cons *pc); - Cons *call(ArgList *args, Environment * &envt, + void prepare(Pair *pc); + Pair *call(ArgList *args, Environment * &envt, Continuation * &cont, FrameObj ** &top_ptr); string ext_repr(); @@ -4,7 +4,7 @@ #include "consts.h" #include <cstdio> -extern Cons *empty_list; +extern Pair *empty_list; const int EVAL_STACK_SIZE = 65536; FrameObj *eval_stack[EVAL_STACK_SIZE]; @@ -63,7 +63,7 @@ Evaluator::Evaluator() { add_builtin_routines(); } -void push(Cons * &pc, FrameObj ** &top_ptr, Environment *envt) { +void push(Pair * &pc, FrameObj ** &top_ptr, Environment *envt) { if (pc->car->is_simple_obj()) // Not an opt invocation { *top_ptr = envt->get_obj(pc->car); // Objectify the symbol @@ -78,22 +78,16 @@ void push(Cons * &pc, FrameObj ** &top_ptr, Environment *envt) { throw NormalError(SYN_ERR_EMPTY_COMB); *top_ptr++ = new RetAddr(pc); // Push the return address - if (!is_list(TO_CONS(pc->car))) + if (!is_list(TO_PAIR(pc->car))) throw TokenError(pc->car->ext_repr(), RUN_ERR_WRONG_NUM_OF_ARGS); // static_cast because of is_simple_obj() is false - pc = static_cast<Cons*>(pc->car); // Go deeper to enter the call + pc = static_cast<Pair*>(pc->car); // Go deeper to enter the call } } -void stack_print(FrameObj **top_ptr) { - for (FrameObj **ptr = eval_stack; ptr != top_ptr; ptr++) - printf("%s\n", (*ptr)->_debug_repr().c_str()); - puts(""); -} - -EvalObj *Evaluator::run_expr(Cons *prog) { +EvalObj *Evaluator::run_expr(Pair *prog) { FrameObj **top_ptr = eval_stack; - Cons *pc = prog; + Pair *pc = prog; Continuation *cont = NULL; // envt is this->envt push(pc, top_ptr, envt); @@ -105,14 +99,14 @@ EvalObj *Evaluator::run_expr(Cons *prog) { push(pc, top_ptr, envt); else { - Cons *args = empty_list; + Pair *args = empty_list; while (!(*(--top_ptr))->is_ret_addr()) - args = new Cons(static_cast<EvalObj*>(*top_ptr), args); + args = new Pair(static_cast<EvalObj*>(*top_ptr), args); //< static_cast because the while condition RetAddr *ret_addr = static_cast<RetAddr*>(*top_ptr); if (!ret_addr->addr) { - Cons *nexp = TO_CONS(cont->proc_body->cdr); + Pair *nexp = TO_PAIR(cont->proc_body->cdr); cont->proc_body = nexp; if (nexp == empty_list) { @@ -11,7 +11,7 @@ class Evaluator { void add_builtin_routines(); /**< Add builtin routines to the env */ public: Evaluator(); - EvalObj *run_expr(Cons *prog); /**< Interpret a program */ + EvalObj *run_expr(Pair *prog); /**< Interpret a program */ }; #endif @@ -6,14 +6,7 @@ #include <cstdio> #ifdef DEBUG -extern Cons *empty_list; -void tree_print(Cons *ptr) { - ptr->_debug_print(); - if (ptr->car->is_cons_obj()) - tree_print(TO_CONS(ptr->car)); - if (ptr->cdr->is_cons_obj()) - tree_print(TO_CONS(ptr->cdr)); -} +extern Pair *empty_list; #endif int main() { @@ -28,9 +21,8 @@ int main() { fprintf(stderr, "Sonsi> "); try { - Cons *tree = ast->absorb(tk); + Pair *tree = ast->absorb(tk); if (!tree) break; - //tree_print(tree); fprintf(stderr, "Ret> $%d = %s\n", rcnt++, eval->run_expr(tree)->ext_repr().c_str()); } @@ -7,14 +7,10 @@ FrameObj::FrameObj(ClassType _ftype) : ftype(_ftype) {} EmptyList *empty_list = new EmptyList(); -EmptyList::EmptyList() : Cons(NULL, NULL) {} +EmptyList::EmptyList() : Pair(NULL, NULL) {} string EmptyList::ext_repr() { return string("()"); } -#ifdef DEBUG -string EmptyList::_debug_repr() { return ext_repr(); } -#endif - bool FrameObj::is_ret_addr() { return ftype & CLS_RET_ADDR; } @@ -23,9 +19,9 @@ bool FrameObj::is_parse_bracket() { return ftype & CLS_PAR_BRA; } -EvalObj::EvalObj(ClassType _otype) : FrameObj(CLS_EVAL_OBJ), otype(_otype) {} +EvalObj::EvalObj(int _otype) : FrameObj(CLS_EVAL_OBJ), otype(_otype) {} -void EvalObj::prepare(Cons *pc) {} +void EvalObj::prepare(Pair *pc) {} bool EvalObj::is_simple_obj() { return otype & CLS_SIM_OBJ; @@ -56,95 +52,43 @@ ClassType EvalObj::get_otype() { return otype; } -#ifdef DEBUG -string EvalObj::_debug_repr() { - return ext_repr(); -} -void EvalObj::_debug_print() { - printf("mem: 0x%llX\n%s\n\n", (unsigned long long)this, - _debug_repr().c_str()); -} -#endif - bool EvalObj::is_true() { return true; } -Cons::Cons(EvalObj *_car, EvalObj *_cdr) : - EvalObj(CLS_CONS_OBJ), car(_car), cdr(_cdr), skip(false), - next(NULL) {} - -string Cons::ext_repr() { - string res = "("; - EvalObj *ptr = this; - for (;ptr != empty_list && ptr->is_cons_obj(); - ptr = TO_CONS(ptr)->cdr) - res += TO_CONS(ptr)->car->ext_repr() + " "; - if (ptr == empty_list) - res[res.length() - 1] = ')'; - else - res += ". " + ptr->ext_repr() + ")"; - return res; -} - -#ifdef DEBUG -string Cons::_debug_repr() { return ext_repr(); } - -void Cons::_debug_print() { - printf("mem: 0x%llX (0x%llX . 0x%llX) | 0x%llX\n%s\n", - (unsigned long long)this, - (unsigned long long)car, - (unsigned long long)cdr, - (unsigned long long)next, - ("car: " + car -> ext_repr() + "\n" + \ - "cdr: " + cdr -> ext_repr() + "\n").c_str()); +string EvalObj::ext_repr() { } -#endif -RetAddr::RetAddr(Cons *_addr) : FrameObj(CLS_RET_ADDR), addr(_addr) {} +Pair::Pair(EvalObj *_car, EvalObj *_cdr) : + EvalObj(CLS_CONS_OBJ), car(_car), cdr(_cdr), skip(false), + next |