diff options
author | Teddy <ted.sybil@gmail.com> | 2013-08-02 20:51:05 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2013-08-02 20:51:05 +0800 |
commit | af2da07be7d3f8a936640ef92b0692710a22e0d4 (patch) | |
tree | 4a93b65ea8514f7d647638c32a007f524bb1076f /builtin.h | |
parent | 1ec3b9d8e1ff352069a1356c4d59f53c7fc64e61 (diff) |
transfering the implementation language to C++
Diffstat (limited to 'builtin.h')
-rw-r--r-- | builtin.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/builtin.h b/builtin.h new file mode 100644 index 0000000..a4468ae --- /dev/null +++ b/builtin.h @@ -0,0 +1,129 @@ +#ifndef BUILTIN_H +#define BUILTIN_H + +#include "model.h" +#include <string> + +using std::string; + +/** @class BoolObj + * Booleans + */ +class BoolObj: public EvalObj { + private: + bool val; /**< true for #t, false for #f */ + public: + BoolObj(bool); + bool is_true(); /**< Override EvalObj `is_true()` */ +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +/** @class IntObj + * A simple implementation of integers + * Will be removed in the future + */ +class IntObj: public NumberObj { + private: + int val; + public: + IntObj(int); +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +/** @class FloatObj + * Floating point numbers + */ +class FloatObj: public NumberObj { + private: + double val; + public: + FloatObj(double); +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + + +/** @class SpecialOptIf + * The implementation of `if` operator + */ +class SpecialOptIf: public SpecialOptObj { + private: + unsigned char state; /**< 0 for prepared, 1 for pre_called */ + /** + * 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 *arg_list, Cons *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 *arg_list, Cons *pc, + Environment *envt); + public: + SpecialOptIf(); + void prepare(Cons *pc); + Cons *call(ArgList *arg_list, Environment * &envt, + Continuation * &cont, FrameObj ** &top_ptr); +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +/** @class SpecialOptLambda + * The implementation of `lambda` operator + */ +class SpecialOptLambda: public SpecialOptObj { + public: + SpecialOptLambda(); + void prepare(Cons *pc); + Cons *call(ArgList *arg_list, Environment * &envt, + Continuation * &cont, FrameObj ** &top_ptr); + +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +/** @class SpecialOptDefine + * The implementation of `define` operator + */ +class SpecialOptDefine: public SpecialOptObj { + public: + SpecialOptDefine(); + void prepare(Cons *pc); + Cons *call(ArgList *arg_list, Environment * &envt, + Continuation * &cont, FrameObj ** &top_ptr); +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +/** @class SpecialOptSet + * The implementation of `set!` operator + */ +class SpecialOptSet: public SpecialOptObj { + public: + SpecialOptSet(); + void prepare(Cons *pc); + Cons *call(ArgList *arg_list, Environment * &envt, + Continuation * &cont, FrameObj ** &top_ptr); +#ifdef DEBUG + string _debug_repr(); +#endif + string ext_repr(); +}; + +#endif |