diff options
-rw-r--r-- | builtin.cpp | 33 | ||||
-rw-r--r-- | builtin.h | 22 | ||||
-rw-r--r-- | eval.cpp | 26 | ||||
-rw-r--r-- | types.cpp | 12 | ||||
-rw-r--r-- | types.h | 11 |
5 files changed, 46 insertions, 58 deletions
diff --git a/builtin.cpp b/builtin.cpp index 3440ab5..6b34d1c 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -16,8 +16,7 @@ extern UnspecObj *unspec_obj; -SpecialOptIf::SpecialOptIf(Environment *envt) : - SpecialOptObj(envt, "if") {} +SpecialOptIf::SpecialOptIf() : SpecialOptObj("if") {} void SpecialOptIf::prepare(Pair *pc) { #define IF_EXP_ERR \ @@ -142,8 +141,7 @@ do \ } \ while (0) -SpecialOptLambda::SpecialOptLambda(Environment *envt) : - SpecialOptObj(envt, "lambda") {} +SpecialOptLambda::SpecialOptLambda() : SpecialOptObj("lambda") {} void SpecialOptLambda::prepare(Pair *pc) { // Do not evaluate anything @@ -183,8 +181,7 @@ Pair *SpecialOptLambda::call(Pair *args, Environment * &lenvt, return ret_addr->next; // Move to the next instruction } -SpecialOptDefine::SpecialOptDefine(Environment *envt) : - SpecialOptObj(envt, "define") {} +SpecialOptDefine::SpecialOptDefine() : SpecialOptObj("define") {} void SpecialOptDefine::prepare(Pair *pc) { Pair *first, *second; @@ -261,8 +258,7 @@ Pair *SpecialOptDefine::call(Pair *args, Environment * &lenvt, return ret_addr->next; } -SpecialOptSet::SpecialOptSet(Environment *envt) : - SpecialOptObj(envt, "set!") {} +SpecialOptSet::SpecialOptSet() : SpecialOptObj("set!") {} void SpecialOptSet::prepare(Pair *pc) { Pair *first, *second; @@ -310,8 +306,7 @@ Pair *SpecialOptSet::call(Pair *args, Environment * &lenvt, return ret_addr->next; } -SpecialOptQuote::SpecialOptQuote(Environment *envt) : - SpecialOptObj(envt, "quote") {} +SpecialOptQuote::SpecialOptQuote() : SpecialOptObj("quote") {} void SpecialOptQuote::prepare(Pair *pc) { // Do not evaluate anything @@ -329,8 +324,7 @@ Pair *SpecialOptQuote::call(Pair *args, Environment * &lenvt, return ret_addr->next; } -SpecialOptEval::SpecialOptEval(Environment *envt) : - SpecialOptObj(envt, "eval") {} +SpecialOptEval::SpecialOptEval() : SpecialOptObj("eval") {} void SpecialOptEval::prepare(Pair *pc) { if (pc->cdr == empty_list || @@ -363,8 +357,7 @@ Pair *SpecialOptEval::call(Pair *args, Environment * &lenvt, throw NormalError(INT_ERR); } -SpecialOptAnd::SpecialOptAnd(Environment *envt) : - SpecialOptObj(envt, "and") {} +SpecialOptAnd::SpecialOptAnd() : SpecialOptObj("and") {} void SpecialOptAnd::prepare(Pair *pc) { pc->next = NULL; @@ -423,8 +416,7 @@ Pair *SpecialOptAnd::call(Pair *args, Environment * &lenvt, throw NormalError(INT_ERR); } -SpecialOptOr::SpecialOptOr(Environment *envt) : - SpecialOptObj(envt, "or") {} +SpecialOptOr::SpecialOptOr() : SpecialOptObj("or") {} void SpecialOptOr::prepare(Pair *pc) { pc->next = NULL; @@ -483,8 +475,7 @@ Pair *SpecialOptOr::call(Pair *args, Environment * &lenvt, throw NormalError(INT_ERR); } -SpecialOptApply::SpecialOptApply(Environment *envt) : - SpecialOptObj(envt, "apply") {} +SpecialOptApply::SpecialOptApply() : SpecialOptObj("apply") {} void SpecialOptApply::prepare(Pair *pc) {} @@ -529,8 +520,7 @@ Pair *SpecialOptApply::call(Pair *_args, Environment * &lenvt, return NULL; } -SpecialOptForce::SpecialOptForce(Environment *envt) : - SpecialOptObj(envt, "force") {} +SpecialOptForce::SpecialOptForce() : SpecialOptObj("force") {} void SpecialOptForce::prepare(Pair *pc) { if (pc->cdr == empty_list || @@ -579,8 +569,7 @@ Pair *SpecialOptForce::call(Pair *_args, Environment * &lenvt, } } -SpecialOptDelay::SpecialOptDelay(Environment *envt) : - SpecialOptObj(envt, "delay") {} +SpecialOptDelay::SpecialOptDelay() : SpecialOptObj("delay") {} void SpecialOptDelay::prepare(Pair *pc) { if (pc->cdr == empty_list || @@ -17,7 +17,7 @@ class SpecialOptIf: public SpecialOptObj {/*{{{*/ unsigned char state; /**< 0 for prepared, 1 for pre_called */ public: /** Construct a `if` operator */ - SpecialOptIf(Environment *envt); + SpecialOptIf(); /** Prevent <condition> and <consequence> from being evaluated */ void prepare(Pair *pc); /** When it's invoked at the first time, it will determined which of @@ -33,7 +33,7 @@ class SpecialOptIf: public SpecialOptObj {/*{{{*/ class SpecialOptLambda: public SpecialOptObj {/*{{{*/ public: /** Construct a `lambda` operator */ - SpecialOptLambda(Environment *envt); + SpecialOptLambda(); /** Prevent all parts of the expression being evaluated */ void prepare(Pair *pc); /** Make up a ProcObj and push into the stack */ @@ -48,7 +48,7 @@ class SpecialOptLambda: public SpecialOptObj {/*{{{*/ class SpecialOptDefine: public SpecialOptObj {/*{{{*/ public: /** Construct a `define` operator */ - SpecialOptDefine(Environment *envt); + SpecialOptDefine(); /** Prevent some parts from being evaluated */ void prepare(Pair *pc); /** See `SpecialOptLambda` */ @@ -62,7 +62,7 @@ class SpecialOptDefine: public SpecialOptObj {/*{{{*/ class SpecialOptSet: public SpecialOptObj {/*{{{*/ public: /** Construct a `set!` operator */ - SpecialOptSet(Environment *envt); + SpecialOptSet(); /** See `SpecialOptDefine */ void prepare(Pair *pc); /** See `SpecialOptDefine */ @@ -76,7 +76,7 @@ class SpecialOptSet: public SpecialOptObj {/*{{{*/ class SpecialOptQuote: public SpecialOptObj {/*{{{*/ public: /** Construct a `quote` operator */ - SpecialOptQuote(Environment *envt); + SpecialOptQuote(); /** Prevent the literal part from being evaluated */ void prepare(Pair *pc); /** Return the literal */ @@ -93,7 +93,7 @@ class SpecialOptEval: public SpecialOptObj {/*{{{*/ unsigned char state; /**< 0 for prepared, 1 for pre_called */ public: /** Construct an `eval` operator */ - SpecialOptEval(Environment *envt); + SpecialOptEval(); /** Set state to 0 */ void prepare(Pair *pc); /** Behaves like the one in `SpecialOptIf` */ @@ -108,7 +108,7 @@ class SpecialOptEval: public SpecialOptObj {/*{{{*/ class SpecialOptAnd: public SpecialOptObj {/*{{{*/ public: /** Construct an `and` operator */ - SpecialOptAnd(Environment *envt); + SpecialOptAnd(); /** Prevent all parts from being evaluated */ void prepare(Pair *pc); /** Acts like `SpecialOptIf` */ @@ -123,7 +123,7 @@ class SpecialOptAnd: public SpecialOptObj {/*{{{*/ class SpecialOptOr: public SpecialOptObj {/*{{{*/ public: /** Construct an `or` operator */ - SpecialOptOr(Environment *envt); + SpecialOptOr(); /** See `SpecialOptAnd` */ void prepare(Pair *pc); /** See `SpecialOptAnd` */ @@ -138,7 +138,7 @@ class SpecialOptOr: public SpecialOptObj {/*{{{*/ class SpecialOptApply: public SpecialOptObj {/*{{{*/ public: /** Construct an `apply` operator */ - SpecialOptApply(Environment *envt); + SpecialOptApply(); /** Do nothing */ void prepare(Pair *pc); /** Provoke the <proc> with args */ @@ -153,7 +153,7 @@ class SpecialOptApply: public SpecialOptObj {/*{{{*/ class SpecialOptDelay: public SpecialOptObj {/*{{{*/ public: /** Construct a `delay` operator */ - SpecialOptDelay(Environment *envt); + SpecialOptDelay(); /** Do nothing */ void prepare(Pair *pc); /** Make up a PromObj and push into the stack */ @@ -171,7 +171,7 @@ class SpecialOptForce: public SpecialOptObj {/*{{{*/ PromObj* prom; public: /** Construct a `force` operator */ - SpecialOptForce(Environment *envt); + SpecialOptForce(); /** Set the state to 0 */ void prepare(Pair *pc); /** Force the evaluation of a promise. If the promise has not been @@ -14,19 +14,19 @@ void Evaluator::add_builtin_routines() { envt->add_binding(new SymObj(name), rout) #define ADD_BUILTIN_PROC(name, rout) \ - ADD_ENTRY(name, new BuiltinProcObj(envt, rout, name)) - - ADD_ENTRY("if", new SpecialOptIf(envt)); - ADD_ENTRY("lambda", new SpecialOptLambda(envt)); - ADD_ENTRY("define", new SpecialOptDefine(envt)); - ADD_ENTRY("set!", new SpecialOptSet(envt)); - ADD_ENTRY("quote", new SpecialOptQuote(envt)); - ADD_ENTRY("eval", new SpecialOptEval(envt)); - ADD_ENTRY("and", new SpecialOptAnd(envt)); - ADD_ENTRY("or", new SpecialOptOr(envt)); - ADD_ENTRY("apply", new SpecialOptApply(envt)); - ADD_ENTRY("delay", new SpecialOptDelay(envt)); - ADD_ENTRY("force", new SpecialOptForce(envt)); + ADD_ENTRY(name, new BuiltinProcObj(rout, name)) + + ADD_ENTRY("if", new SpecialOptIf()); + ADD_ENTRY("lambda", new SpecialOptLambda()); + ADD_ENTRY("define", new SpecialOptDefine()); + ADD_ENTRY("set!", new SpecialOptSet()); + ADD_ENTRY("quote", new SpecialOptQuote()); + ADD_ENTRY("eval", new SpecialOptEval()); + ADD_ENTRY("and", new SpecialOptAnd()); + ADD_ENTRY("or", new SpecialOptOr()); + ADD_ENTRY("apply", new SpecialOptApply()); + ADD_ENTRY("delay", new SpecialOptDelay()); + ADD_ENTRY("force", new SpecialOptForce()); ADD_BUILTIN_PROC("+", num_add); ADD_BUILTIN_PROC("-", num_sub); @@ -57,14 +57,14 @@ SymObj::SymObj(const string &str) : return new ReprStr(val); } -OptObj::OptObj(Environment *_envt, int otype) : - Container(otype | CLS_SIM_OBJ | CLS_OPT_OBJ, true), envt(_envt) {} +OptObj::OptObj(int otype) : + Container(otype | CLS_SIM_OBJ | CLS_OPT_OBJ, true) {} void OptObj::gc_decrement() {} void OptObj::gc_trigger(EvalObj ** &tail, EvalObjSet &visited) {} ProcObj::ProcObj(Pair *_body, Environment *_envt, EvalObj *_params) : - OptObj(_envt, CLS_CONTAINER), body(_body), params(_params) { + OptObj(CLS_CONTAINER), body(_body), params(_params), envt(_envt) { gc.attach(body); gc.attach(params); gc.attach(envt); @@ -148,7 +148,7 @@ ReprCons *ProcObj::get_repr_cons() { return new ReprStr("#<Procedure>"); } -SpecialOptObj::SpecialOptObj(Environment *envt, string _name) : OptObj(envt), name(_name) {} +SpecialOptObj::SpecialOptObj(string _name) : OptObj(), name(_name) {} ReprCons *SpecialOptObj::get_repr_cons() { return new ReprStr("#<Built-in Opt: " + name + ">"); } @@ -293,8 +293,8 @@ bool StrObj::eq(StrObj *r) { return str == r->str; } -BuiltinProcObj::BuiltinProcObj(Environment *envt, BuiltinProc f, string _name) : - OptObj(envt), handler(f), name(_name) {} +BuiltinProcObj::BuiltinProcObj(BuiltinProc f, string _name) : + OptObj(), handler(f), name(_name) {} Pair *BuiltinProcObj::call(Pair *args, Environment * &lenvt, Continuation * &cont, EvalObj ** &top_ptr) { @@ -139,11 +139,8 @@ class Continuation; */ class OptObj: public Container {/*{{{*/ public: - /** Pointer to the environment */ - Environment *envt; - - OptObj(Environment *envt, int otype = 0); + OptObj(int otype = 0); /** * The function is called when an operation is needed. * @param args The argument list (the first one is the opt itself) @@ -168,6 +165,8 @@ class ProcObj: public OptObj {/*{{{*/ Pair *body; /** The arguments: <list> | var1 ... | var1 var2 ... . varn */ EvalObj *params; + /** Pointer to the environment */ + Environment *envt; /** Conctructs a ProcObj */ ProcObj(Pair *body, Environment *envt, EvalObj *params); @@ -187,7 +186,7 @@ class SpecialOptObj: public OptObj {/*{{{*/ protected: string name; public: - SpecialOptObj(Environment *envt, string name); + SpecialOptObj(string name); ReprCons *get_repr_cons(); };/*}}}*/ @@ -205,7 +204,7 @@ class BuiltinProcObj: public OptObj {/*{{{*/ * @param proc the actual handler * @param name the name of this built-in procedure */ - BuiltinProcObj(Environment *envt, BuiltinProc proc, string name); + BuiltinProcObj(BuiltinProc proc, string name); Pair *call(Pair *args, Environment * &envt, Continuation * &cont, EvalObj ** &top_ptr); ReprCons *get_repr_cons(); |